Sto tentando di inviare un messaggio a un'applicazione in esecuzione con un account utente diverso (un utente che ha anche effettuato l'accesso con un account diverso sul computer, usando l'interruttore rapido utente su XP e versioni successive ed esegui l'applicazione).Invio di un messaggio a un'applicazione in esecuzione su un account utente secondario connesso
Lo sfondo è che la mia applicazione può aggiornarsi, ma per fare ciò tutte le istanze in esecuzione devono essere chiuse per prime.
Le istanze devono essere arrestate (invece di uccidere semplicemente il processo), quindi l'aggiornamento lo fa inviando loro un messaggio personalizzato (con SendMessage
). Per inviare un messaggio ho bisogno di un handle per la finestra principale del processo.
Questo funziona correttamente utilizzando EnumWindows
- finché le istanze sono in esecuzione con lo stesso account utente, poiché EnumWindows
non elenca le finestre appartenenti a un altro utente.
Così ho provato un approccio diverso. Ho usato CreateToolhelp32Snapshot
per elencare per primo tutti i processi in esecuzione sul sistema e quindi per ripetere i thread chiamando lo CreateToolhelp32Snapshot
di nuovo. Con quegli id di thread potrei quindi elencare le loro finestre usando EnumThreadWindows
.
Ancora una volta funziona correttamente, ma .. ancora una volta solo per l'utente attualmente connesso. Il problema qui è che anche se CreateToolhelp32Snapshot
elenca gli ID di processo appartenenti a un utente diverso, non elenca gli ID dei thread che appartengono ad essi. Il codice per questo è un po 'lungo, ma se è necessario posso modificarlo - per favore lascia un commento per quello.
Quindi, come è possibile ottenere l'handle della finestra principale della mia applicazione in esecuzione su un altro account utente connesso?
Potrebbe essere necessario usare qualcosa come named pipe per aggirare queste restrizioni di sicurezza.Quello che stai cercando di fare è simile ai servizi di sessione 0 che comunicano con il desktop interattivo e quindi le soluzioni che funzionano lì funzioneranno per te. –
Mi sembra anche un po 'banale arrestare i processi dell'utente senza dare loro la possibilità di obiettare. La maggior parte degli updaters aspetta solo fino al prossimo avvio dell'app per l'aggiornamento. –
+1 a David's. Persino Windows ti avvisa degli altri utenti connessi se provi a chiudere mentre c'è un'altra sessione attiva. Tutto ciò che "parla" ai processi attraverso i confini delle sessioni è un po 'imbarazzante e spaventoso. Immagina semplicemente un'applicazione che fa scattare qualcosa come "L'utente" Amministratore "ha questo documento aperto, vuoi che io interrompa quel processo in modo da poter lavorare sul documento?' –