Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2011, 00:26   #1
androns
 
Регистрация: 24.08.2011
Сообщений: 3
По умолчанию Получить "window handle" по PID в Delphi

Доброе времья суток!
Задача проста: имеется некоторый процесс, о котором известно только имя exe-файла. Процесс может создавать несколько окон. Мне нужно закрыть эти окна, не убивая сам процесс (процесс это поддерживает, он продолжает висеть в трее после закрытия окон).
Я рассуждаю так: мне нужно найти хэндлы этих окон и по хэндлам закрыть окна. Но заголовки окон могут меняться, по-этому хэндлы следует искать по PID.
Так как одновременно может быть запущена только одна инстанция этого процесса, то найти его PID довольно просто. А вот найти эти хэндлы по PID никак не получается.
Буду весьма благодарен, если Вы поможете написать функцию, которая по PID возвращает хэндлы всех окон соответствующего процесса. А ещё лучше - процедуру, которая по PID закрывает все окна соответствующего процесса.
androns вне форума Ответить с цитированием
Старый 25.08.2011, 00:45   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я уже писал такую.
используйте EnumWindows+сравнение ПИД.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 01:03   #3
androns
 
Регистрация: 24.08.2011
Сообщений: 3
По умолчанию

Спасибо, про EnumWindows мне уже Гугл подсказал. Но мне не совсем понятно, как её вызывать.
Я далеко не программист, но жизнь заставляет заниматься и тем, чего не умею.

Пол ночи просидел, провозился с этим EnumWindows. Если я правильно понимаю, то нужно с помощю EnumWindows перебирать все окна и сравнивать PID с "эталоном", и, если совпадает, то закрывать это окно. На русском звучит красиво, вот кто бы на Delphi перевёл. Я не понимаю, каким образом из этого EnumWindows можно вытащить PID для сравнения, и, если совпадает, каким образом вытащить хэндл.

Последний раз редактировалось Stilet; 25.08.2011 в 14:16.
androns вне форума Ответить с цитированием
Старый 25.08.2011, 14:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
function ProcCloseEnum(hwnd:THandle;data:pointer):BOOL;stdcall;
var pid:DWORD;
begin
 Result:=true;
 GetWindowThreadProcessId(hwnd,pid);
 if pid=DWORD(data) then
  begin
   //сюда вставьте то что надо сделать с окном.(окно hwnd)
  end;
end;

EnumWindows(@ProcCloseEnum,<pid, процесса у которого надо чтото сделать с окнами>);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.08.2011, 01:10   #5
androns
 
Регистрация: 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.
androns вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти 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