2012-02-12 29 views
11

Quiero cerrar la ventana con algún nombre (cualquier aplicación, por ejemplo, calculadora, etc.). ¿Cómo hacerlo en C#? Importar funciones de WinAPI?¿Cómo cerrar la ventana por su nombre?

+3

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

+0

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

+0

@Lloyd: No es un duplicado, matar a un proceso no es lo mismo que cerrando una ventana. –

Respuesta

23

Sí, debe importar las funciones de la API de Windows: FindWindow(), SendMessage(); y WM_CLOSE constante.

definiciones nativos de las funciones API de 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; 

código de 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í, esto funciona bien para el Bloc de notas (asumiendo, por supuesto, que el título de la ventana es exactamente lo que ha dado aquí, que probablemente no sea la mayor parte del tiempo). Pero no funcionará para las aplicaciones que tienen varias ventanas de nivel superior, a menos que hayan sido específicamente diseñadas para cerrar toda la aplicación después del cierre de una única ventana de nivel superior. De lo contrario, debe enviar 'WM_CLOSE' a * cada * de las ventanas de nivel superior para asegurarse de que la aplicación se cierre. –

+1

Además, las aplicaciones pueden elegir responder a 'WM_CLOSE' de la forma que deseen. Por ejemplo, algunos programas eligen minimizar al área de notificación de la barra de tareas al recibir este mensaje, en lugar de cerrarse. Como no puede controlar cómo responde la aplicación al mensaje, debe probar este método ampliamente y darse cuenta de cuán potencialmente frágil es al tratar con aplicaciones desconocidas y no probadas. –

+0

¿Es correcto como este 'CloseWindow (windowPtr)'? –

1

usted está tratando de cerrar las ventanas que pertenecen a otros procesos. Eso no es algo que pueda asumir que funcionará de manera confiable. Por un lado, USTED no posee esas ventanas, por lo que realmente no tiene ningún derecho automático para ir y meterse con las ventanas de los otros procesos.

Como sugiere la otra respuesta, puede intentar enviar un WM_CLOSE a la ventana, pero viene con la advertencia de que el otro proceso no tiene derecho a cumplirlo. La respuesta a WM_CLOSE puede ser cualquier cosa para la aceptación y un cierre limpio para el rechazo total. En este último caso, realmente no tienes opción. No es tu proceso. En el medio, como has visto, podría haber cualquier tipo de ventanas intermedias, cuadros de diálogo, etc. con los que tendrías que lidiar.

¿Qué estás tratando de lograr aquí? ¿Por qué intentas cerrar ventanas pertenecientes a otros procesos? Podría ayudar a aclarar cuál es el objetivo.

Cuestiones relacionadas