| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > handle of the application в handle of the window |
| Автор: Fedia 5.9.2006, 02:48 | ||||
| Приветствую всех ! Задачка такая: запускаю приложение через ShellExecute и как результат функции ShellExecute получаю его указатель. Например:
Необходимо по указателю hApp получить хендл активного окна запущенного приложения в том виде, в котором его возвращает функция FindWindow. Например:
Т.е. мне необходимо из hApp получить AHWND. Возможно ли это реализовать ? |
| Автор: bazzzman 5.9.2006, 03:10 |
| Не совсем понял вопрос... Если надо найти дочернее окно какого-то конкретного окна, то: 1. GetWindow 2. EnumChildWindows 3. FindWindowEx |
| Автор: Fedia 5.9.2006, 04:18 |
Мне нужно найти хендл активного окна приложения, зная хендл самого приложения. Хендл приложения получаю при его запуске посредством ShellExecute. |
| Автор: dumb 5.9.2006, 04:32 |
| CreateProcess + EnumThreadWindows( pi.dwThreadId, ... |
| Автор: bazzzman 5.9.2006, 04:42 | ||||
Это не то... При чем тут CreateProcess, если "нужно найти хендл активного окна приложения, зная хендл самого приложения"? Вот как это делаю я:
По-хорошему надо сделать более серьезную проверку ошибок... |
| Автор: Fedia 5.9.2006, 05:33 | ||
Не работает. Проверяю так:
bazzzman, кстати сейчас проверил, твоя функция возвращает хендл окна, запустившего приложение. |
| Автор: bazzzman 5.9.2006, 06:12 | ||
| Значит это окно имеет фокус ввода. Что не так? Надо что-то другое? Тогда сформулируй нормально вопрос. hAp:=ShellExecute(0, 'open', 'C:\test.exe', nil, nil, SW_SHOWNORMAL); - возвращает не handle окна:
Значит GetWindowThreadProcessID(hWnd, nil); мы не можем сделать. Нежен threadId => CreateProcess как и предлагал dumb или ShellExecuteEx. И уже потом AttachThreadInput. Думаю информации и так уже достаточно, чтобы ты самостоятельно с этим разобрался. Читай MSDN. |
| Автор: Romikgy 5.9.2006, 10:21 | ||||||
почему? можно
здесь надо заюзать ф-цию pid:=GetProcessId(hApp); дабы поличить пид, а далее юзая EnumThreadWindows(pid,.... Добавлено @ 10:25 правда
|
| Автор: Fedia 5.9.2006, 23:06 | ||||
По этой функции ничего нет в справке Windows SDK. Модуль Winbase также отсутствует. Не могу найти модуль, который необходимо было бы подключить, для использования этой функции. Кроме того, функция ShellExecute возвращает:
ЗЫ: спасибо, что отвечаешь, хочу таки добить этот вопрос, давно меня волновавший. |
| Автор: Romikgy 6.9.2006, 08:45 | ||
получается да , т.к. я видел что для получения своего хистенса надо юзать GetModuleHandle с параметром nil (хотя я и не разобрался конкретно что есть этот инстанс
А ключевая фраза здесь вот какая ниже ХР СП1 этой фичи нет! (имхо если этой ф-ции нет то проще будет перечислить все процессы в системе и от них взять хендлы и сравнить с нужным) |
| Автор: Fedia 6.9.2006, 09:07 | ||
Я вообще не придал этой фразе значения, потому, что у меня Windows XP SP2
Ок. Завтра попробую, если время на это будет. |
| Автор: Romikgy 6.9.2006, 09:25 | ||
тогда это в кернеле32, есть такая ф-ция, можно динамически открыть ее через лоадлибрари и попросить адрес этой ф-ции |
| Автор: Fedia 11.9.2006, 05:55 | ||
Добрался я таки и до этой части. В общем ты частично прав, в библиотеке kernel32.dll есть функция GetProcessId. Правда если в качестве параметра ей передавать результат возвращаемый функцией ShellExecute, то GetProcessId возвращает 0. Следовательно, не такой параметр ей требуется. |
| Автор: Romikgy 11.9.2006, 08:49 | ||||
GetProcessId требует хендл процесса , а не его хистенс Добавлено @ 08:56 http://www.codeproject.com/win32/Remote.asp |
| Автор: Fedia 11.9.2006, 11:47 | ||
Я же уже подводил к этому
Или я тебя не понял ? |
| Автор: Romikgy 11.9.2006, 12:59 |
| скорее всего смотрел? |
| Автор: Fedia 12.9.2006, 01:33 | ||
Посмотрел. Не нашел там прямого указания, как вообще можно использовать HINSTANCE от ShellExecute. Кроме того заинтересовала терминология, озвученная автором статьи. Имеем:
Является ли результат, возвращаемый ShellExecute чем-то из вышеперечисленного ? Мне кажется что нет. Romikgy, в общем, хватит говорить загадками, колись, что хотел сказать |
| Автор: Romikgy 12.9.2006, 08:54 | ||||
Че ?! да ни че просто помочь хотел, а там есть 3 способа получения пида чужего процесса
ща посмотрю |
| Автор: Romikgy 12.9.2006, 09:29 | ||||
кса а вместо этого , вот это юзать не? ShellExecuteEx
|
| Автор: dumb 12.9.2006, 10:43 |
извините, что влезаю: а чем CreateProcess то не угодил? к чему эти шаманские танцы с бубнами?.. ![]() |
| Автор: Fedia 12.9.2006, 11:26 | ||
Не просто хотел, а и помогаешь. Я думал, что у тебя уже есть решение задачи, и ты пытаешься натолкнуть меня на какую-то мысль. Так что надеюсь без обид. Ну мне ж уже на самом деле dumb предлагал уже использовать CreateProcess. Если бы мне требовалось срочное решение проблемы, я бы этим вариантом воспользовался. А мне лишь хотелось узнать, можно ли использовать результат функции ShellExecute для поиска окон запущенного приложения. |
| Автор: Romikgy 12.9.2006, 12:27 | ||
Только у меня не получилось отделить хендл апликейшена
|
| Автор: Fedia 13.9.2006, 00:57 | ||||
Да вообще, то, что называется
Romikgy, Спасибо за помощь в рассмотрении этого вопроса |
| Автор: Romikgy 13.9.2006, 08:56 |
| Fedia, Имхо я привел код который ищет то что те нужно по хистенсу, или нет? А я имел ввиду, не хендл процесса апликейшена , а хендл окна апликейшена! (я проверял на приложении написаном на дельфи!) Ведь в этом приложении имеется окно апликухи и главная форма(окно) т.е. 2 окна и как определить какое окно относится к апликухе , а какое к форме , я пока не в курсе, но если знаешь название окна то можно по нему отсеят, тогда вопросов не будет! Добавлено @ 08:57 Пазям. PS только я так и не понял помогло те это или нет? |
| Автор: Fedia 13.9.2006, 09:58 | ||||
Нет, просто эта ветка начинает напоминать сломанный телефон. Не исключаю, что я не могу точно сформулировать свой вопрос, возможно ты не можешь меня понять, возможно я не могу понять твои ответы (я ведь только принялся за изучение API). ХЗ в общем.
Попробуй в качестве параметра функции GetHWND_from_Histance передать HINSTANCE от ShellExecute, а не HMODULE от GetModuleHandle. Хоть эти два типа и объявлены в Delphi как Саrdinal, но похоже разнятся по смыслу. Может тогда будет понятно, что я пытался реализовать. Ведь именно от HINSTANCE, возвращаемого ShellExecute я пытался получить перечень окон. И неоднократно об этом писал. Но все равно, благодаря твоим примерам и ссылкам на статьи я много чего полезного для себя подчеркнул. За это и +. |
| Автор: Romikgy 13.9.2006, 11:38 | ||
попробую когда домой дойду а ф-ция ShellExecute у мя где то был исходник , так он юзает GetModuleHandle , найду выложу |
| Автор: Fedia 13.9.2006, 22:21 | ||
Попробуй конечно.
Результирующие значения этих функций находятся в разном числовом диапазоне. Если HINSTANCE от ShellExecute как правило не больше 1000, то HMODULE от GetModuleHandle переваливает за миллион. А исходник посмотреть интересно было бы. |
| Автор: Romikgy 13.9.2006, 23:29 | ||||||||
Добавлено @ 23:31 т.е. в конце все равно приходим к
|
| Автор: Yanis 14.9.2006, 09:29 |
Кто бы сомневался P. S. А вопрос то решён или вы за так ликбез устроили? |
| Автор: Romikgy 14.9.2006, 10:34 |
А че? человек спрашает , я отвечаю |
| Автор: Yanis 14.9.2006, 10:39 |
Просто интересно стало. Тема досих пор не тонет и вопрос вроде не помечен как решённый. P. S. Вдруг я тоже хочу поучавствовать |
| Автор: Fedia 17.9.2006, 23:57 |
Оказалось, что вопрос скорее всего не имеет решения |
| Автор: Romikgy 18.9.2006, 00:08 |
| Еще одно предложение, напоследок, правда оно не будет иметь отношения к им только запускаешь файл, а потом делаешь снимок всех процессов, и отбираешь те нужный по имени ехе файла, после этого перечисляешь все окна данного процесса и находишь нужно те окно ,и в конце получается и волки сыты и овцы целы, т.е. юзаешь shellexecute и получаешь хендл окна |
| Автор: Fedia 18.9.2006, 00:17 |
| Romikgy, это решение уже есть в моей копилке. Обсуждалось http://forum.vingrad.ru/index.php?showtopic=110766. |
| Автор: Romikgy 18.9.2006, 00:31 |
ну как знаешь |
| Автор: Yanis 18.9.2006, 10:56 | ||||||
Так вот, что требуется то
При запуске будет выдано окошко с сообщением, что сейчас будут перечислены окна запущенного процесса notepad.exe. Для большей наглядности можно в запустившемся окне Блокнота сначала вызвать окно замены (Ctrl+H) и плюс к этому вызвать пункт меню Открыть. В этом случае будут перечислены 3 дочерних окна (а точнее их текст, полученый через GetWindowText) и их описатели. У меня это выглядит так:
При проверке учитывается тот факт, что окно что бы быть окном должно иметь хотя бы один флаг среди флагов перечисленных в aTrueWndStyles и иметь флаг WS_VISIBLE. Код не универсальный и он умеет определять окна только одного потока, ID которого возвращается в pi.dwThreadId. Конечно для универсальности нужно определять окна всех потоков. Для этого придётся немного усложнить код и получить ID всех потоков и уже для каждого вызвать EnumThreadWindows. Получить список всех потоков процесса можно через функцию CreateToolhelp32Snapshot с флагом TH32CS_SNAPTHREAD и далее перечислить их из получившегося снимка при помощи Thread32First & Thread32Next. P. S. Извиняюсь, если боян P. S. S. Коментарии не писал. Код довольно прозрачный |
| Автор: Fedia 26.9.2006, 00:37 | ||
Вот и потонула ветка А через ShellExecuteEx тоже самое реализовать сможешь ? Я пробовал так:
|
| Автор: dumb 26.9.2006, 07:37 | ||
Fedia, для нормальной работы с хэндлами таки стоит использовать CreateProcess. почему? - вот цитата из MSDN по SHELLEXECUTEINFO.hProcess:
|
| Автор: Yanis 26.9.2006, 09:32 |
Почему? Потому что пример с CreateProcess, а не с ShellExecute(Ex)? Ну да ладно... Вобщем тебе выбирать каким способом пользоваться. Проблема решается с помощью функции GetProcessId. Присутствует она начиная с XP, поэтому даже в 2000 работать уже не будет. |
| Автор: Fedia 26.9.2006, 11:40 | ||
| dumb, Ага, читал я справку MSDN по SHELLEXECUTEINFO. И судя по ней в моих задачах hProcess будет не NULL. А в большей эффективности использования CreateProcess я убедился после того, как стало понятно, что ShellExecute(Ex) все равно вызывают CreateProcess. Поэтому полностью с тобой согласен Yanis,
Нет, вопрос в этой ветке изначально звучал даже уже, и касался он только ShellExecute. Единственно, что мне необходимо было узнать в этой ветке, это то, что результат ShellExecute для решения задачи использовать не получиться. А за твой пример отдельное спасибо. Ах да, мне же эту функцию Romikgy уже приводил, сорри. |