|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
[Win32] FindWindow e login utenti
Come si può far funzionare la FindWindow in caso di più utenti loggati?
Ho un servizio che lancia un processo (sempre con privilegi System) che monitora i processi e le finestre aperte, però la ricerca delle finestre funziona solo per il primo utente che esegue il login, non riesco a vedere le finestre aperte dai successivi utenti, nonostante sia un servizio. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
http://msdn2.microsoft.com/en-us/library/ms681928.aspx e anche http://support.microsoft.com/kb/310153/en-us Comunque FindWindow cerca solo nel desktop corrente. Una ipotesi (che non so se funzionerebbe) è questa: se riesci ad ottenere un handle al desktop che ti interessa, chiami SetThreadDesktop e quindi poi usi FindWindow. Non sono sicuro che sia la strada giusta ma si può provare.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
posto che io non ho lavorato molto coi desktop e le window stations, concordo con la tua idea: secondo me sarebbe la strada giusta.
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Sì, confermo che è la strada giusta. Ho creato questo breve programmino di prova:
Codice:
#define STRICT
#include <windows.h>
#include <stdio.h>
int main (void)
{
HDESK hDesk;
HWND hWnd;
STARTUPINFO si;
PROCESS_INFORMATION pi;
hDesk = CreateDesktop ("MyDesktop", NULL, NULL, 0, GENERIC_ALL, NULL);
if (hDesk != NULL)
{
ZeroMemory (&si, sizeof (si));
si.cb = sizeof (si);
si.lpDesktop = "MyDesktop";
if (CreateProcess ("C:\\WINNT\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
printf ("Avviato notepad\n");
Sleep (2000);
if (SetThreadDesktop (hDesk))
{
printf ("Impostato desktop nel thread\n");
hWnd = FindWindow ("Notepad", NULL);
if (hWnd != NULL)
{
printf ("Trovata finestra %08X\n", hWnd);
SendMessage (hWnd, WM_CLOSE, 0, 0L);
}
else
printf ("FindWindow error %lu\n", GetLastError ());
}
else
printf ("SetThreadDesktop error %lu\n", GetLastError ());
}
else
printf ("CreateProcess error %lu\n", GetLastError ());
CloseDesktop (hDesk);
}
else
printf ("CreateDesktop error %lu\n", GetLastError ());
return 0;
}
Quindi attendo qualche secondo (perché l'applicazione sia correttamente avviata) e poi assegno il nuovo desktop al thread corrente. A quel punto FindWindow è in grado di cercare le finestre in quel desktop. Output del programma: Avviato notepad Impostato desktop nel thread Trovata finestra 000203CE Segno che ha trovato la finestra nel nuovo desktop.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ho fatto delle prove, ma senza successo.
Il sistema è composto da una parte di interfaccia che viene lanciata all'avvio di Windows che comunica via socket con il servizio che controlla le attività svolte sul PC. Siccome pare che l'unico modo per ottenere il desktop di un applicativo sia in base al threadID, dall'interfaccia mi faccio inviare il threadID del thread principale, ma la chiamata a GetThreadDesktop fallisce miseramente se il ThreadID è di un processo appartenente ad un deskop differente a quello del servizio, mentre ha successo se appartiene allo stesso desktop. Ho controllato con ProcessExplorer la correttezza del ThreadID ricevuto. Forse è sbagliato l'utilizzo che ne faccio. Eseguo la GetThreadDesktop nella funzione callback del thread che esegue la findwindow, non so se può essere questo il problema. Ho anche provato ad eseguire la chiamata nel thread principale del programma, ma il risultato non cambia. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:49.




















