2012-02-12 3 views
11

Я хочу закрыть окно с каким-либо именем (любое приложение, например, калькулятор и т. Д.). Как это сделать на C#? Импортировать функции WinAPI?Как закрыть окно по его названию?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox вы знаете – m0s

+0

Возможный дубликат. http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@Lloyd: Не дубликат, убийство процесса - это не то же самое, что и закрытие окна. –

ответ

23

Да, вы должны импортировать функции Windows API: FindWindow(), SendMessage(); и WM_CLOSE константа.

Родные определения функций API 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; 

код клиента:

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

Да, это прекрасно подходит для Notepad (предполагая, конечно, что название окна именно то, что вы здесь дали, что, вероятно, не в большинстве случаев). Но он не будет работать для приложений, которые имеют несколько окон верхнего уровня, если только они не были специально разработаны для закрытия всего приложения после закрытия одного окна верхнего уровня. В противном случае вам нужно отправить 'WM_CLOSE' в * каждый * окна верхнего уровня, чтобы убедиться, что приложение закрыто. –

+1

Кроме того, приложения могут отвечать на 'WM_CLOSE', как им нравится. Например, некоторые программы выбирают минимизировать себя в области уведомлений панели задач после получения этого сообщения, а не фактически закрывать. Так как вы не можете контролировать, как приложение реагирует на сообщение, вам нужно тщательно протестировать этот метод и понять, насколько потенциально он уязвим при работе с неизвестными и непроверенными приложениями. –

+0

Правильно ли это 'CloseWindow (windowPtr)'? –

1

Вы пытаетесь закрыть окна, принадлежащие к другим процессам. Это не то, что вы можете предположить, будет надежно. Во-первых, у ВАС нет этих окон, поэтому у ВАС нет никакого автоматического права идти и возиться с окнами других процессов.

Как вы найдете в другом ответе, вы можете попробовать отправить WM_CLOSE в окно, но он содержит предостережение, что другой процесс на самом деле не имеет права его почитать. Ответ на WM_CLOSE может быть чем-то приемлемым и чистое закрытие для прямого отклонения. В последнем случае у вас действительно нет выбора. Это не ваш процесс. Между вами, как вы видели, могут быть какие-то промежуточные окна, диалоговые окна и т. Д., С которыми вам придется бороться.

Итак, что вы пытаетесь достичь здесь? Почему вы пытаетесь закрыть окна, принадлежащие другим процессам? Это может помочь прояснить, какова цель.

Смежные вопросы