-
Привет всем!!!
Возникла следующа проблемка:
Как можно получить Handle окона если известен ProcessID?
-
> [0] Xan (06.01.09 18:47)
у процесса может быть много окно, какое интересует?
-
> Eraser
В данном случае его главный, что бы можно было выполнить GetWindowsText.
-
Что такое "главный окно" ?
И почему нельзя выполнить GetWindowsText, если "окно не главный" ?
-
> Сергей М.
Копирую Rect окта (к примеру Calc.exe) в Bitmap, после чего файл нужно сохранить с именем полученным из GetWindowsText.
-
> Сергей М.
Сори. Очепятался (Копирую Rect окна) :-)
-
> Копирую Rect окна
Но причем тут "главность" окна ?
С тем же успехом это можно проделать с любым окном.
-
Короче говоря, дело обстоит так:
1. С пом. EnumWindows[Ex] получаешь список существующих окон тек.десктопа (всех или только интересующих - решать тебе)
2. Для каждого из окон в списке с пом. GetWindowThreadProcessId получаешь PID процесса, создавшего окно, сравниваешь с интересующим тебя PID.
Окна, отобранные на этапе в п.2, созданы интересующим тебя процессом.
Какое из них "главное" - решать только тебе, птому что в общем случае никаких признаков "главности" у окон не существует.
-
> Сергей М.
Да вот шото роюсь по форумам, а найти как из
ProcessID получить его
Handle не могу. Нашол разве, что Тупое сравнение PID из найденных окон и PID из найденных в системе в системе.
Обратное преобразование работает через
GetWindowThreadProcessId(GetForegroundWindow);потом
function OpenProcess(PROCESS_ALL_ACCESS,True, ProcessId)
а
Result возвращает непонятно шо, при чём не зависимо от привилегий.
Так вот у меня мини диспетчер в котором я хотел бы определять есть ли у процесса окно и если есть то вывести по верх всех и скопировать облась окна в Bitmap ну и т. д.....
З. Ы. вроде
Handle окон в системе не равно количеству процессов.
-
> [8] Xan (06.01.09 20:46)
> З. Ы. вроде Handle окон в системе не равно количеству процессов.
я об этом тебе еще в 1 сообщении написал.
-
> Eraser
Скажем так, у нуль формы, на сколько я помню есть только одно окно, так вот мне нужно найти его, а передомной есть только список процессов.
Аналогично для других многооконных приложений.
По этому и написал что ищу "Главное" окно.
-
> [10] Xan (06.01.09 21:02)
> По этому и написал что ищу "Главное" окно.
не бывает главного окна.
-
> Xan (06.01.09 21:02) [10]
Сообщи нам признаки главного окна, т.е. те признаки по которым можно было бы его выделить среди скажем 10 других окон.
-
> 10 других окон
каких окон
-
> не бывает главного окна
и меется ввиду в пределах приложения.
-
> Xan (07.01.09 08:08) [13]
> каких окон
Окон, созданных в контексте некоего интересующего процесса.
> меется ввиду в пределах приложения
Разумеется.
Отсюда и вопрос у тебе: некое приложение создало, скажем, дюжину окон - какое из них считать "главным" ?
-
> Xan
Например, окно формы Application.MaiForm в VCL-приложении не счтается главным окном этого приложения.
Конкретно в VCL-приложении главным окном принято считать окно, создаваемое объектом Application. Это окно невидимо, т.к. имеет нулевые значения ширины и высоты, и предназначено оно для внутритехнологических целей.
-
> некое приложение создало, скажем, дюжину окон
Вспомним про Winword.exe. При открытии какого нибудь документа запускается приложение и его клинтское окно, где мы и можем даблюдать наш документ. При закрытии клиенского окна само приложение не закроется, что не равно обратному.
Так вот получение окна приложения Winword.exe из ID процесса будет дочтатошно, ну или хотябы какоето из клиентских окон.
Главное, как получить Handle одного из окна, а не количество окон у процесса, и какое из них главное там будет видно.
-
> [17] Xan (07.01.09 17:21)
читай ветку сначала, до полного просветления.. тебе тут уже на все ответели по 2 раза )
-
> ответели по 2 раза
Уже и так сделал.
Прямо поболтать не даёш :-)
-
> Xan (07.01.09 17:21) [17]
Есть предложение не использовать термин "Главное окно", а использовать термин "Top Level" окно. Но таких окон тоже может быть больше чем одно в пределах одного приложения. На таскбаре кнопки появляются именно для таких окон. Вот такие окна можно без проблем выделить.
-
> Вот такие окна можно без проблем выделить
Только не говори что ето через EnumWindow, это и так понятно. А как через процессы?
-
> 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 // значение, определяемое прикладной программой
);
-
-
> как через процессы?
А никак.
В WinXP функции а-ля EnumProcessWindows() не существует.
-
> DVM
> Сергей М.
Спасибо Попытаюсь.