Я хочу закрыть окно с каким-либо именем (любое приложение, например, калькулятор и т. Д.). Как это сделать на C#? Импортировать функции WinAPI?Как закрыть окно по его названию?
ответ
Да, вы должны импортировать функции 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);
Да, это прекрасно подходит для Notepad (предполагая, конечно, что название окна именно то, что вы здесь дали, что, вероятно, не в большинстве случаев). Но он не будет работать для приложений, которые имеют несколько окон верхнего уровня, если только они не были специально разработаны для закрытия всего приложения после закрытия одного окна верхнего уровня. В противном случае вам нужно отправить 'WM_CLOSE' в * каждый * окна верхнего уровня, чтобы убедиться, что приложение закрыто. –
Кроме того, приложения могут отвечать на 'WM_CLOSE', как им нравится. Например, некоторые программы выбирают минимизировать себя в области уведомлений панели задач после получения этого сообщения, а не фактически закрывать. Так как вы не можете контролировать, как приложение реагирует на сообщение, вам нужно тщательно протестировать этот метод и понять, насколько потенциально он уязвим при работе с неизвестными и непроверенными приложениями. –
Правильно ли это 'CloseWindow (windowPtr)'? –
Вы пытаетесь закрыть окна, принадлежащие к другим процессам. Это не то, что вы можете предположить, будет надежно. Во-первых, у ВАС нет этих окон, поэтому у ВАС нет никакого автоматического права идти и возиться с окнами других процессов.
Как вы найдете в другом ответе, вы можете попробовать отправить WM_CLOSE в окно, но он содержит предостережение, что другой процесс на самом деле не имеет права его почитать. Ответ на WM_CLOSE может быть чем-то приемлемым и чистое закрытие для прямого отклонения. В последнем случае у вас действительно нет выбора. Это не ваш процесс. Между вами, как вы видели, могут быть какие-то промежуточные окна, диалоговые окна и т. Д., С которыми вам придется бороться.
Итак, что вы пытаетесь достичь здесь? Почему вы пытаетесь закрыть окна, принадлежащие другим процессам? Это может помочь прояснить, какова цель.
- 1. Delphi - Скрыть окно по его названию
- 2. Сделать объект по его названию
- 3. Как обратиться к объекту по его названию?
- 4. Как получить динамический идентификатор по его названию
- 5. Как вызвать метод геттера по его названию?
- 6. Как получить тип класса по его названию?
- 7. Как добавить событие динамически по его названию
- 8. Как закрыть документ, не закрывая его окно?
- 9. как открыть другое окно и закрыть окно, которое вызывает его
- 10. Как искать файл по его названию и открывать его?
- 11. JavaScript: найти всплывающее окно по URL-адресу и закрыть его
- 12. Selenium IDE - выберитеWindow по названию
- 13. Создает объект класса по его названию
- 14. Закрыть диалоговое окно, щелкнув за его пределами
- 15. См. UIView по его названию в переменной
- 16. Проверка связанного объекта по его названию
- 17. получить документ Google по его названию?
- 18. Получение рабочего листа по его кодовому названию
- 19. Как закрыть окно, щелкнув по нему?
- 20. Как закрыть великолепное всплывающее окно по jquery
- 21. Объект пространства имен по его названию
- 22. Hibernate: задать поле по его названию столбца
- 23. Найти список по его названию C#
- 24. Получить член класса по его названию
- 25. Как закрыть домашнее окно
- 26. Как закрыть окно SQLBase
- 27. Как закрыть окно OSX?
- 28. Как закрыть всплывающее окно?
- 29. Как закрыть диалоговое окно
- 30. Как проверить, открыто ли окно браузера по названию в пакете?
http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox вы знаете – m0s
Возможный дубликат. http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd
@Lloyd: Не дубликат, убийство процесса - это не то же самое, что и закрытие окна. –