View Full Version : [Win32] FindWindow e login utenti
tomminno
17-07-2007, 01:00
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.
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.Premesso che queste sono questioni abbastanza "avanzate" in Win32 e che non conosco benissimo, posso consigliarti di leggere la documentazione dedicata a Window Stations e Desktops:
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.
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. posto che io non ho lavorato molto coi desktop e le window stations, concordo con la tua idea: secondo me sarebbe la strada giusta.
secondo me sarebbe la strada giusta.Sì, confermo che è la strada giusta. Ho creato questo breve programmino di prova:
#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;
}
Creo un nuovo desktop con un nome specifico e lancio in quel desktop una istanza di Notepad (blocco note). La finestra principale di Notepad è di una classe specifica che si chiama (guarda caso... ;) ) "Notepad".
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.
tomminno
19-07-2007, 23:24
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.
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.