|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
25.08.2011, 00:26 | #1 |
Регистрация: 24.08.2011
Сообщений: 3
|
Получить "window handle" по PID в Delphi
Доброе времья суток!
Задача проста: имеется некоторый процесс, о котором известно только имя exe-файла. Процесс может создавать несколько окон. Мне нужно закрыть эти окна, не убивая сам процесс (процесс это поддерживает, он продолжает висеть в трее после закрытия окон). Я рассуждаю так: мне нужно найти хэндлы этих окон и по хэндлам закрыть окна. Но заголовки окон могут меняться, по-этому хэндлы следует искать по PID. Так как одновременно может быть запущена только одна инстанция этого процесса, то найти его PID довольно просто. А вот найти эти хэндлы по PID никак не получается. Буду весьма благодарен, если Вы поможете написать функцию, которая по PID возвращает хэндлы всех окон соответствующего процесса. А ещё лучше - процедуру, которая по PID закрывает все окна соответствующего процесса. |
25.08.2011, 00:45 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
я уже писал такую.
используйте EnumWindows+сравнение ПИД. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
25.08.2011, 01:03 | #3 |
Регистрация: 24.08.2011
Сообщений: 3
|
Спасибо, про EnumWindows мне уже Гугл подсказал. Но мне не совсем понятно, как её вызывать.
Я далеко не программист, но жизнь заставляет заниматься и тем, чего не умею. Пол ночи просидел, провозился с этим EnumWindows. Если я правильно понимаю, то нужно с помощю EnumWindows перебирать все окна и сравнивать PID с "эталоном", и, если совпадает, то закрывать это окно. На русском звучит красиво, вот кто бы на Delphi перевёл. Я не понимаю, каким образом из этого EnumWindows можно вытащить PID для сравнения, и, если совпадает, каким образом вытащить хэндл. Последний раз редактировалось Stilet; 25.08.2011 в 14:16. |
25.08.2011, 14:08 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
26.08.2011, 01:10 | #5 |
Регистрация: 24.08.2011
Сообщений: 3
|
Спасибо огромное! Ваш код работает на ура!
Правда, проблема пришла от туда, от куда я её совсем не ждал: я не могу закрыть окна. SendMessage(hwnd, VM_CLOSE, 0 ,0) и DestroyWindow(hwnd) не работают, а SendMessage(hwnd, WM_DESTROY, 0, 0) и SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0) закрывают не только окна, но и процесс. Самый близкий к желаемому результат даёт ShowWindow(hwnd, SW_HIDE). Это прячет окна, не закрывая процесса, но после этого нельзя вызвать окно программы из трея. Попробую по хэндлу установить фокус на окно и через keybd_event симитировать нажатие Alt+F4. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Найти handle окна "консольного приложения" | Человек_Борща | Общие вопросы Delphi | 2 | 01.10.2010 18:40 |
Как обойти "преобразование типа из "string" в "float" невозможно" | lexluter1988 | Помощь студентам | 1 | 07.08.2010 12:23 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
PHP(или другой язык): Получить все пары "имя" -> "значение" переданные методом POST | KingOfNothing | PHP | 4 | 12.04.2009 14:06 |