2013-05-27 10 views
8

Nella mia applicazione console C#, sto utilizzando SendMessage() per ridurre a icona tutte le finestre, mostrando in modo efficace il Windows 8 Legacy Desktop. Funziona alla grande, ma devo usare un Thread.Sleep(1000) per aspettare che il desktop legacy sia effettivamente mostrato prima di provare a fare qualcos'altro.Utilizzo di SendMessage() per ridurre a icona tutte le finestre, ma è necessario un modo più efficiente di Thread.Sleep() per attendere fino a quando il desktop precedente mostra

IntPtr lHwnd = FindWindow("Shell_TrayWnd", null); 
SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero); 
Thread.Sleep(1000); 

Ho molta voglia di sostituire la Thread.Sleep() con un modo più efficiente per rilevare che l'eredità Desktop sta mostrando prima di proseguire.

Qualche idea?

Modifica: Ecco i wrapper e le costanti di Interop. nel caso in cui essa aiuta ..

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)] 
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 

const int WM_COMMAND = 0x111; 
const int MIN_ALL = 419; 
const int MIN_ALL_UNDO = 416; 
+4

Come fai a sapere che nel momento in cui stai aspettando che il desktop venga mostrato, l'utente non ha minimizzato una delle finestre? Qual è il vero problema che stai cercando di risolvere? Forse c'è un modo più affidabile per raggiungere questo obiettivo. – hvd

+0

Sto cercando di ridurre a icona tutte le finestre, quindi avviare un programma desktop legacy specifico nella riga successiva. Suppongo che il sistema non sia stato toccato per un po 'di tempo, e sto solo cercando di resettare il computer per mostrare un programma. Usando SendMessage() il mio modo di ridurre al minimo il desktop legacy anche se il computer sta attualmente mostrando app Start Screen ... ma è necessario un po 'di tempo tra SendMessage() e in realtà il programma che sto per avviare. – user1190320

+2

Assicurati sempre che il tuo programma di disinstallazione sia impeccabile quando scrivi codice come questo. Sarà la funzione più utilizzata del tuo programma. –

risposta

2

Non sono sicuro se questo funzionerà meglio per voi, ma forse vale la pena provare ...

(1) aggiungere al progetto un riferimento a "Shell32" (tramite Aggiungi riferimento -> COM -> Controlli e automazione della shell Microsoft).

(2) Impostare "Tipi di intervallo di incorporamento" del riferimento su false.

(3) Utilizzare il codice seguente per minimizzare tutte le finestre:

dynamic shell = new Shell32.ShellClass(); 
shell.MinimizeAll(); 

Tuttavia, ho il sospetto che questo è solo un modo alternativo di fare la SendMessage().

+0

Ho provato quello che hai detto e non c'era alcuna differenza. Apprezzo il tuo suggerimento. – user1190320

+0

@ user1190320 Ho temuto tanto. :( –

Problemi correlati