2012-02-12 17 views
11

Desidero chiudere la finestra con un nome (qualsiasi applicazione, ad esempio, calcolatrice e così via). Come si fa in C#? Importa le funzioni WinAPI?Come chiudere la finestra con il suo nome?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox sai – m0s

+0

Possibile duplicato. http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@Lloyd: non è un duplicato, uccidere un processo non è la stessa cosa di chiudere una finestra. –

risposta

23

Sì, è necessario importare le funzioni API di Windows: FindWindow(), SendMessage(); e WM_CLOSE costante.

definizioni nativi delle funzioni API di Windows:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

/// <summary> 
/// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
/// </summary> 
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

const UInt32 WM_CLOSE = 0x0010; 

codice cliente:

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
if (windowPtr == IntPtr.Zero) 
{ 
    Console.WriteLine("Window not found"); 
    return; 
} 

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
+1

Sì, questo funziona perfettamente per Blocco note (presupponendo, ovviamente, che il titolo della finestra sia esattamente quello che hai dato qui, che probabilmente non è la maggior parte delle volte). Ma non funzionerà per le applicazioni che hanno più finestre di primo livello, a meno che non siano state progettate specificamente per chiudere l'intera app dopo la chiusura di una singola finestra di primo livello. Altrimenti, è necessario inviare 'WM_CLOSE' a * ciascuno * delle finestre di livello superiore per assicurarsi che l'app venga chiusa. –

+1

Inoltre, le app possono scegliere di rispondere a "WM_CLOSE" come preferiscono. Ad esempio, alcuni programmi scelgono di minimizzarsi nell'area di notifica della barra delle applicazioni al momento della ricezione di questo messaggio, piuttosto che chiudere effettivamente. Poiché non è possibile controllare il modo in cui l'applicazione risponde al messaggio, è necessario testare ampiamente questo metodo e rendersi conto di quanto sia potenzialmente fragile quando si tratta di applicazioni sconosciute e non testate. –

+0

È corretto come questo 'CloseWindow (windowPtr)'? –

1

si sta cercando di chiudere le finestre appartenenti ad altri processi. Questo non è qualcosa che si può assumere andrà in modo affidabile. Per prima cosa, TU non possiedi quelle finestre così non hai alcun diritto automatico di andare a fare casino con le finestre degli altri processi.

Come suggerisce l'altra risposta, è possibile provare a inviare un WM_CLOSE alla finestra, ma viene fornito con l'avvertenza che l'altro processo non ha il diritto di onorarlo. La risposta a WM_CLOSE può essere qualsiasi cosa all'accettazione e un arresto pulito al rifiuto definitivo. In quest'ultimo caso, non hai davvero alcuna possibilità. Non è il tuo processo. Nel mezzo, come hai visto, potrebbero esserci dei tipi di finestre intermedie, finestre di dialogo, ecc. Con cui dovresti fare i conti.

Allora, cosa stai cercando di ottenere qui? Perché stai cercando di chiudere Windows appartenenti ad altri processi? Potrebbe aiutare a chiarire qual è lo scopo.

Problemi correlati