Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Получение Handle окон по их PID   Найти похожие ветки 

 
Xan   (2009-01-06 18:47) [0]

Привет всем!!!

Возникла следующа проблемка:
Как можно получить Handle окона если известен ProcessID?


 
Eraser ©   (2009-01-06 18:51) [1]

> [0] Xan   (06.01.09 18:47)

у процесса может быть много окно, какое интересует?


 
Xan   (2009-01-06 18:59) [2]


> Eraser


В данном случае его главный, что бы можно было выполнить GetWindowsText.


 
Сергей М. ©   (2009-01-06 19:34) [3]

Что такое "главный окно" ?
И почему нельзя выполнить GetWindowsText, если "окно не главный" ?


 
Xan   (2009-01-06 19:52) [4]


> Сергей М.


Копирую Rect окта (к примеру Calc.exe) в Bitmap, после чего файл нужно сохранить с именем полученным из GetWindowsText.


 
Xan   (2009-01-06 19:54) [5]


> Сергей М.


Сори. Очепятался (Копирую Rect окна) :-)


 
Сергей М. ©   (2009-01-06 20:07) [6]


> Копирую Rect окна


Но причем тут "главность" окна ?
С тем же успехом это можно проделать с любым окном.


 
Сергей М. ©   (2009-01-06 20:18) [7]

Короче говоря, дело обстоит так:

1. С пом. EnumWindows[Ex] получаешь список существующих окон тек.десктопа (всех или только интересующих - решать тебе)

2. Для каждого из окон в списке с пом. GetWindowThreadProcessId получаешь PID процесса, создавшего окно, сравниваешь с интересующим тебя PID.

Окна, отобранные на этапе в п.2, созданы интересующим тебя процессом.
Какое из них "главное" - решать только тебе, птому что в общем случае никаких признаков "главности" у окон не существует.


 
Xan   (2009-01-06 20:46) [8]


> Сергей М.


Да вот шото роюсь по форумам, а найти как из ProcessID получить его Handle не могу. Нашол разве, что Тупое сравнение PID из найденных окон и PID из найденных в системе в системе.

Обратное преобразование работает через
GetWindowThreadProcessId(GetForegroundWindow);
потом

function OpenProcess(PROCESS_ALL_ACCESS,True, ProcessId)

а Result возвращает непонятно шо, при чём не зависимо от привилегий.

Так вот у меня мини диспетчер в котором я хотел бы определять есть ли у процесса окно и если есть то вывести по верх всех и скопировать облась окна в Bitmap ну и т. д.....

З. Ы. вроде Handle окон в системе не равно количеству процессов.


 
Eraser ©   (2009-01-06 20:51) [9]

> [8] Xan   (06.01.09 20:46)


> З. Ы. вроде Handle окон в системе не равно количеству процессов.

я об этом тебе еще в 1 сообщении написал.


 
Xan   (2009-01-06 21:02) [10]


> Eraser


Скажем так, у нуль формы, на сколько я помню есть только одно окно, так вот мне нужно найти его, а передомной есть только список процессов.
Аналогично для других многооконных приложений.

По этому и написал что ищу "Главное" окно.


 
Eraser ©   (2009-01-06 22:10) [11]

> [10] Xan   (06.01.09 21:02)


> По этому и написал что ищу "Главное" окно.

не бывает главного окна.


 
DVM ©   (2009-01-06 22:36) [12]


> Xan   (06.01.09 21:02) [10]

Сообщи нам признаки главного окна, т.е. те признаки по которым можно было бы его выделить среди скажем 10 других окон.


 
Xan   (2009-01-07 08:08) [13]


> 10 других окон


каких окон


 
Xan   (2009-01-07 08:12) [14]


> не бывает главного окна


и меется ввиду в пределах приложения.


 
Сергей М. ©   (2009-01-07 11:19) [15]


> Xan   (07.01.09 08:08) [13]
> каких окон


Окон, созданных в контексте некоего интересующего процесса.


> меется ввиду в пределах приложения


Разумеется.

Отсюда и вопрос у тебе: некое приложение создало, скажем, дюжину окон - какое из них считать "главным" ?


 
Сергей М. ©   (2009-01-07 11:30) [16]


> Xan


Например, окно формы Application.MaiForm в VCL-приложении не счтается главным окном этого приложения.
Конкретно в VCL-приложении главным окном принято считать окно, создаваемое объектом Application. Это окно невидимо, т.к. имеет нулевые значения ширины и высоты, и предназначено оно для внутритехнологических целей.


 
Xan   (2009-01-07 17:21) [17]


> некое приложение создало, скажем, дюжину окон


Вспомним про Winword.exe. При открытии какого нибудь документа запускается приложение и его клинтское окно, где мы и можем даблюдать наш документ. При закрытии клиенского окна само приложение не закроется, что не равно обратному.

Так вот получение окна приложения Winword.exe из ID процесса будет дочтатошно, ну или хотябы какоето из клиентских окон.

Главное, как получить Handle одного из окна, а не количество окон у процесса, и какое из них главное там будет видно.


 
Eraser ©   (2009-01-07 17:34) [18]

> [17] Xan   (07.01.09 17:21)

читай ветку сначала, до полного просветления.. тебе тут уже на все ответели по 2 раза )


 
Xan   (2009-01-07 18:16) [19]


> ответели по 2 раза


Уже и так сделал.

Прямо поболтать не даёш :-)


 
DVM ©   (2009-01-07 20:22) [20]


> Xan   (07.01.09 17:21) [17]

Есть предложение не использовать термин "Главное окно", а использовать термин "Top Level" окно. Но таких окон тоже может быть больше чем одно в пределах одного приложения. На таскбаре кнопки появляются именно для таких окон. Вот такие окна можно без проблем выделить.


 
Xan   (2009-01-09 08:43) [21]


> Вот такие окна можно без проблем выделить


Только не говори  что ето через EnumWindow, это и так понятно. А как через процессы?


 
DVM ©   (2009-01-09 11:27) [22]


> 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   // значение, определяемое прикладной программой
);


 
DVM ©   (2009-01-09 11:30) [23]


> Xan   (09.01.09 08:43) [21]

http://www.codeproject.com/KB/system/ntenumthreads.aspx

здесь пример на си


 
Сергей М. ©   (2009-01-09 18:02) [24]


> как через процессы?


А никак.

В WinXP функции а-ля EnumProcessWindows() не существует.


 
Xan   (2009-01-21 08:06) [25]


> DVM


> Сергей М.


Спасибо Попытаюсь.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.066 c
2-1268379582
timekiller
2010-03-12 10:39
2010.08.27
ProgreessBar, подвисание проги


2-1267701184
Первокурсница
2010-03-04 14:13
2010.08.27
Delphi 7: маленькая ошибка, StringGrid и массив


2-1272874591
romario
2010-05-03 12:16
2010.08.27
сравнение двух произвольных файлов


15-1267536056
12
2010-03-02 16:20
2010.08.27
Виды демократии. Опробуем на игре. И видим, что не готовы..


15-1273161371
Jalevis
2010-05-06 19:56
2010.08.27
ни один проект не запускается из Дельфей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский