![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение Handle окон по их PID [D7, WinXP]
Xan © (2009-01-06 18:47:00)Привет всем!!!
Возникла следующа проблемка:
Как можно получить Handle окона если известен ProcessID?
Xan (2009-01-21 08:06:00) [1]
> DVM
> Сергей М.
Спасибо Попытаюсь.
Сергей М. (2009-01-09 18:02:00) [2]
> как через процессы?
А никак.
В WinXP функции а-ля EnumProcessWindows() не существует.
DVM (2009-01-09 11:30:00) [3]
> Xan (09.01.09 08:43) [21]
http://www.codeproject.com/KB/system/ntenumthreads.aspx
здесь пример на си
DVM (2009-01-09 11:27:00) [4]
> Xan (09.01.09 08:43) [21]
BOOL WINAPI EnumThreads(LPTHREADINFO lpThreadInfo, DWORD cb, LPDWORD cbNeeded);
BOOL WINAPI EnumProcessThreads(LPTHREADINFO lpThreadInfo, DWORD cb, LPDWORD cbNeeded);
BOOL WINAPI EnumProcessThreadsEx(DWORD dwPid, LPTHREADINFO lpThreadInfo, DWORD cb,
LPDWORD cbNeeded);
BOOL EnumThreadWindows
(
DWORD dwThreadId, // идентификатор потока
WNDENUMPROC lpfn, // указатель на функцию возврата
LPARAM lParam // значение, определяемое прикладной программой
);
Xan (2009-01-09 08:43:00) [5]
> Вот такие окна можно без проблем выделить
Только не говори что ето через EnumWindow, это и так понятно. А как через процессы?
DVM (2009-01-07 20:22:00) [6]
> Xan (07.01.09 17:21) [17]
Есть предложение не использовать термин "Главное окно", а использовать термин "Top Level" окно. Но таких окон тоже может быть больше чем одно в пределах одного приложения. На таскбаре кнопки появляются именно для таких окон. Вот такие окна можно без проблем выделить.
Xan (2009-01-07 18:16:00) [7]
> ответели по 2 раза
Уже и так сделал.
Прямо поболтать не даёш :-)
Eraser (2009-01-07 17:34:00) [8]> [17] Xan (07.01.09 17:21)
читай ветку сначала, до полного просветления.. тебе тут уже на все ответели по 2 раза )
Xan (2009-01-07 17:21:00) [9]
> некое приложение создало, скажем, дюжину окон
Вспомним про Winword.exe. При открытии какого нибудь документа запускается приложение и его клинтское окно, где мы и можем даблюдать наш документ. При закрытии клиенского окна само приложение не закроется, что не равно обратному.
Так вот получение окна приложения Winword.exe из ID процесса будет дочтатошно, ну или хотябы какоето из клиентских окон.
Главное, как получить Handle одного из окна, а не количество окон у процесса, и какое из них главное там будет видно.
Сергей М. (2009-01-07 11:30:00) [10]
> Xan
Например, окно формы Application.MaiForm в VCL-приложении несчтается главным окном этого приложения.
Конкретно в VCL-приложении главным окном принято считать окно, создаваемое объектом Application. Это окно невидимо, т.к. имеет нулевые значения ширины и высоты, и предназначено оно для внутритехнологических целей.
Сергей М. (2009-01-07 11:19:00) [11]
> Xan (07.01.09 08:08) [13]
> каких окон
Окон, созданных в контексте некоего интересующего процесса.
> меется ввиду в пределах приложения
Разумеется.
Отсюда и вопрос у тебе: некое приложение создало, скажем, дюжину окон - какое из них считать "главным" ?
Xan (2009-01-07 08:12:00) [12]
> не бывает главного окна
и меется ввиду в пределах приложения.
Xan (2009-01-07 08:08:00) [13]
> 10 других окон
каких окон
DVM (2009-01-06 22:36:00) [14]
> Xan (06.01.09 21:02) [10]
Сообщи нам признаки главного окна, т.е. те признаки по которым можно было бы его выделить среди скажем 10 других окон.
Eraser (2009-01-06 22:10:00) [15]> [10] Xan (06.01.09 21:02)
> По этому и написал что ищу "Главное" окно.
не бывает главного окна.
Xan (2009-01-06 21:02:00) [16]
> Eraser
Скажем так, у нуль формы, на сколько я помню есть только одно окно, так вот мне нужно найти его, а передомной есть только список процессов.
Аналогично для других многооконных приложений.
По этому и написал что ищу "Главное"окно.
Eraser (2009-01-06 20:51:00) [17]> [8] Xan (06.01.09 20:46)
> З. Ы. вроде Handle окон в системе не равно количеству процессов.
я об этом тебе еще в 1 сообщении написал.
Xan (2009-01-06 20:46:00) [18]
> Сергей М.
Да вот шото роюсь по форумам, а найти как из ProcessIDполучить его Handleне могу. Нашол разве, что Тупое сравнение PID из найденных окон и PID из найденных в системе в системе.
Обратное преобразование работает через
GetWindowThreadProcessId(GetForegroundWindow);
потом
function OpenProcess(PROCESS_ALL_ACCESS,True, ProcessId)
а Resultвозвращает непонятно шо, при чём не зависимо от привилегий.
Так вот у меня мини диспетчер в котором я хотел бы определять есть ли у процесса окно и если есть то вывести по верх всех и скопировать облась окна в Bitmap ну и т. д.....
З. Ы. вроде Handleокон в системе не равно количеству процессов.
Сергей М. (2009-01-06 20:18:00) [19]Короче говоря, дело обстоит так:
1. С пом. EnumWindows[Ex] получаешь список существующих окон тек.десктопа (всех или только интересующих - решать тебе)
2. Для каждого из окон в списке с пом. GetWindowThreadProcessId получаешь PID процесса, создавшего окно, сравниваешь с интересующим тебя PID.
Окна, отобранные на этапе в п.2, созданы интересующим тебя процессом.
Какое из них "главное" - решать только тебе, птому что в общем случае никаких признаков "главности" у окон не существует.
Сергей М. (2009-01-06 20:07:00) [20]
> Копирую Rect окна
Но причем тут "главность" окна ?
С тем же успехом это можно проделать с любым окном.