| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > определение активного окна приложения |
| Автор: Fedia 6.9.2006, 07:23 | ||||
Получаю структуру PROCESSENTRY32, относящуюся с запущенному приложению с определенным именем:
Необходимо по данным переменной PID найти активное окно приложения, информацию по которому эта переменная содержит. Пробовал через:
И еще вопрос: из перечня хендлов окон, которое передает функция EnumThreadWindows, как мне найти активное окно приложения ? |
| Автор: Rennigth 6.9.2006, 08:56 | ||||
ничего поутру (с похмелья
по хендлам окон уже думаю определишь какое активно... |
| Автор: gonzales 7.9.2006, 15:37 |
не нашлось ли решение данной задачи, меня оно тоже интересует |
| Автор: Fedia 8.9.2006, 08:55 | ||
Решил задачу "в лоб", перебором всех окон в порядке Z последовательности:
Если кто-то найдет способ попроще (думаю что он должен быть), то очень интересно на этот способ будет посмотреть. gonzales, передаем в функцию массив не дочерних окон приложения и в качестве результата получаем самое верхнее из их числа. |
| Автор: gonzales 8.9.2006, 09:40 | ||
а если оно в данный момент свернуто? |
| Автор: Fedia 8.9.2006, 11:15 | ||
Можно попробовать так:
|
| Автор: Fedia 8.9.2006, 11:32 | ||
А лучше наверное проверять и видимость и WindowsState одновременно:
|
| Автор: gonzales 8.9.2006, 11:43 |
| мне кажется можно проще, по крайней мере с винампом канает делаем проверку каждого окна на IsWindowVisible=true or IsIconic=true, отсекается все, кроме формы и верхнего уровня - application, далее делаем проверку GetClientRect на ненулевую ширину и высоту формы (у Application - форма имеет 0,0) |
| Автор: Fedia 8.9.2006, 12:03 | ||
Да, так на самом деле попроще. Только тогда проверка должна быть на IsIconic=false. |
| Автор: gonzales 8.9.2006, 12:08 | ||
тогда свернутая форма не пройдет проверку (но если форма открыта, то да) |
| Автор: Romikgy 8.9.2006, 14:44 |
| имхо можно , чуть хакерским способом внедрится в нужный процесс и внутри него вызвать GetActiveWindow и забрать значение активного окна |
| Автор: gonzales 8.9.2006, 15:32 |
а как это сделать? то есть, если мы имеем только имя исполняемого файла, то что мы можем сделать: 1. по имени файла определяем ID работающего процесса 2. по ID процесса мы находим дискрипторы всех недочерних окон данного процесса а как реализовать Ваше предложение - не совсем понятно |
| Автор: Romikgy 8.9.2006, 15:43 | ||
inject главное слово тоже
внедряемся в процесс и спрашиваем кто активный Добавлено @ 15:43 про инжект по форуму поищи много чего написано |