Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> handle of the application в handle of the window, определение указателя окна 
V
    Опции темы
Fedia
Дата 5.9.2006, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Приветствую всех !
Задачка такая: запускаю приложение через ShellExecute и как результат функции ShellExecute получаю его указатель. Например:
Код

var
  hApp: Cardinal;
//....
hApp:=ShellExecute(0, 'open', 'C:\text.exe', nil, nil, SW_SHOWNORMAL)

Необходимо по указателю hApp получить хендл активного окна запущенного приложения в том виде, в котором его возвращает функция FindWindow. Например:
Код

var
  AHWND: HWND;
//....
AHWND:=FindWindow(nil, 'Тест'); //'Тест' - заголовок нужного мне окна приложения

Т.е. мне необходимо из hApp получить AHWND. Возможно ли это реализовать ?

Это сообщение отредактировал(а) Fedia - 5.9.2006, 02:49


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
bazzzman
Дата 5.9.2006, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: нет
Всего: 2



Не совсем понял вопрос...
Если надо найти дочернее окно какого-то конкретного окна, то:
1. GetWindow
2. EnumChildWindows
3. FindWindowEx
PM MAIL WWW   Вверх
Fedia
Дата 5.9.2006, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(bazzzman @  5.9.2006,  03:10 Найти цитируемый пост)
Если надо найти дочернее окно какого-то конкретного окна, то:

Мне нужно найти хендл активного окна приложения, зная хендл самого приложения. Хендл приложения получаю при его запуске посредством ShellExecute.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
dumb
Дата 5.9.2006, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



CreateProcess + EnumThreadWindows( pi.dwThreadId, ...
PM MAIL   Вверх
bazzzman
Дата 5.9.2006, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: нет
Всего: 2



Цитата(dumb @ 5.9.2006,  04:32)
CreateProcess + EnumThreadWindows( pi.dwThreadId, ...

Это не то... При чем тут CreateProcess, если "нужно найти хендл активного окна приложения, зная хендл самого приложения"?

Вот как это делаю я:
Код

function GetFocusWindow(hWnd:THandle=0) : THandle;
var FgThreadID: Integer;
begin
 if hWnd=0 then hWnd:=GetForegroundWindow;

 FgThreadID := GetWindowThreadProcessID(hWnd, nil);
 if AttachThreadInput(GetCurrentThreadID, FgThreadID, True) then
  begin
    Result := GetFocus;
    AttachThreadInput(GetCurrentThreadID, FgThreadID, False);
  end else Result := GetFocus;
end;


По-хорошему надо сделать более серьезную проверку ошибок...  smile 
PM MAIL WWW   Вверх
Fedia
Дата 5.9.2006, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(bazzzman @  5.9.2006,  04:42 Найти цитируемый пост)
Вот как это делаю я:

Не работает. Проверяю так:
Код

var
  hAp: Cardinal;
  AHWND, AHWND_test: HWND;
begin
  hAp:=ShellExecute(0, 'open', 'C:\test.exe', nil, nil, SW_SHOWNORMAL);
  AHWND:=FindWindow(nil, 'Тест');
  AHWND_test:=GetFocusWindow(hAp);
  if AHWND = AHWND_test then
  ShowMessage('1');
end;


bazzzman, кстати сейчас проверил, твоя функция возвращает хендл окна, запустившего приложение.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
bazzzman
Дата 5.9.2006, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: нет
Всего: 2



Значит это окно имеет фокус ввода. Что не так?

Надо что-то другое? Тогда сформулируй нормально вопрос. 

hAp:=ShellExecute(0, 'open', 'C:\test.exe', nil, nil, SW_SHOWNORMAL); - возвращает не handle окна:
Цитата

Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.


Значит GetWindowThreadProcessID(hWnd, nil); мы не можем сделать. Нежен threadId => CreateProcess как и предлагал dumb или ShellExecuteEx. И уже потом AttachThreadInput.

Думаю информации и так уже достаточно, чтобы ты самостоятельно с этим разобрался. Читай MSDN.


PM MAIL WWW   Вверх
Fedia
Дата 5.9.2006, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(bazzzman @  5.9.2006,  06:12 Найти цитируемый пост)
Надо что-то другое? Тогда сформулируй нормально вопрос. 

Вопрос я вроде сформулировал довольно четко:
Цитата(Fedia @  5.9.2006,  04:18 Найти цитируемый пост)
Мне нужно найти хендл активного окна приложения, зная хендл самого приложения. Хендл приложения получаю при его запуске посредством ShellExecute.

Твоя функция возвращает:
Цитата(Fedia @  5.9.2006,  05:33 Найти цитируемый пост)
хендл окна, запустившего приложение.
,
а нужно: хендл активного окна запущенного через ShellExecute приложения. Разница надеюсь понятна ?

Цитата(bazzzman @  5.9.2006,  06:12 Найти цитируемый пост)
Думаю информации и так уже достаточно, чтобы ты самостоятельно с этим разобрался. Читай MSDN.

Как раз разбираюсь. За советы спасибо. Думаю перечисленных в этой ветке функций точно хватит для реализации сабжа.

Цитата(bazzzman @  5.9.2006,  06:12 Найти цитируемый пост)
Значит GetWindowThreadProcessID(hWnd, nil); мы не можем сделать.

А еще спрашиваешь, что не так ...
Значит если запускать приложение посредством ShellExecute, то по результату, возвращаемому этой функцией хендл активного окна запущенного (именно через ShellExecute) приложения не получить ?

Это сообщение отредактировал(а) Fedia - 5.9.2006, 07:17


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Romikgy
Дата 5.9.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(Fedia @  5.9.2006,  05:34 Найти цитируемый пост)
Значит если запускать приложение посредством ShellExecute, то по результату, возвращаемому этой функцией хендл активного окна запущенного (именно через ShellExecute) приложения не получить ?

почему? можно 

Цитата(Fedia @  5.9.2006,  01:48 Найти цитируемый пост)
var
  hApp: Cardinal;
//....
hApp:=ShellExecute(0, 'open', 'C:\text.exe', nil, nil, SW_SHOWNORMAL)

здесь надо заюзать ф-цию 
pid:=GetProcessId(hApp);
дабы поличить пид, а далее юзая
Цитата(dumb @  5.9.2006,  03:32 Найти цитируемый пост)
EnumThreadWindows( pi.dwThreadId, ...

EnumThreadWindows(pid,....

Добавлено @ 10:25 
правда
Код

GetProcessId

Retrieves the process identifier of the specified process.

DWORD WINAPI GetProcessId(
  HANDLE Process
);

Parameters

Process
    [in] A handle to the process. The handle must have the PROCESS_QUERY_INFORMATION access right. 

Return Values

If the function succeeds, the return value is the process identifier of the specified process.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

Until a process terminates, its process identifier uniquely identifies it on the system. For more information about access rights, see Process Security and Access Rights.
Requirements
Client    Requires Windows Vista or Windows XP SP1.
Server    Requires Windows Server "Longhorn" or Windows Server 2003.
Header    

Declared in Winbase.h; include Windows.h.
Library    

Use Kernel32.lib.
DLL    Requires Kernel32.dll.



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fedia
Дата 5.9.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(Romikgy @  5.9.2006,  10:21 Найти цитируемый пост)
pid:=GetProcessId(hApp);

Цитата(Romikgy @  5.9.2006,  10:21 Найти цитируемый пост)
Declared in Winbase.h; include Windows.h.

По этой функции ничего нет в справке Windows SDK. Модуль Winbase также отсутствует. Не могу найти модуль, который необходимо было бы подключить, для использования этой функции.
Кроме того, функция ShellExecute возвращает:
Цитата

return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.
, а в качестве параметра функция GetProcessId требует:
Цитата

A handle to the process
 Это разве одно и тоже ?
ЗЫ: спасибо, что отвечаешь, хочу таки добить этот вопрос, давно меня волновавший.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Romikgy
Дата 6.9.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(Fedia @  5.9.2006,  22:06 Найти цитируемый пост)
Это разве одно и тоже ?

получается да , т.к. я видел что для получения своего хистенса надо юзать GetModuleHandle с параметром nil (хотя я и не разобрался конкретно что есть этот инстанс smile)
Цитата(Fedia @  5.9.2006,  22:06 Найти цитируемый пост)
По этой функции ничего нет в справке Windows SDK. Модуль Winbase также отсутствует. Не могу найти модуль, который необходимо было бы подключить, для использования этой функции.

А ключевая фраза здесь вот какая
Цитата(Romikgy @  5.9.2006,  09:21 Найти цитируемый пост)
Client    Requires Windows Vista or Windows XP SP1.

ниже ХР СП1 этой фичи нет!
(имхо если этой ф-ции нет то проще будет перечислить все процессы в системе и от них взять хендлы и сравнить с нужным)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fedia
Дата 6.9.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(Romikgy @  6.9.2006,  08:45 Найти цитируемый пост)
А ключевая фраза здесь вот какая

Я вообще не придал этой фразе значения, потому, что у меня Windows XP SP2 smile

Цитата(Romikgy @  6.9.2006,  08:45 Найти цитируемый пост)
имхо если этой ф-ции нет то проще будет перечислить все процессы в системе и от них взять хендлы и сравнить с нужным

Ок. Завтра попробую, если время на это будет.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Romikgy
Дата 6.9.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(Fedia @  6.9.2006,  08:07 Найти цитируемый пост)
Я вообще не придал этой фразе значения, потому, что у меня Windows XP SP2

тогда это в кернеле32, есть такая ф-ция, можно динамически открыть ее через лоадлибрари и попросить адрес этой ф-ции


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fedia
Дата 11.9.2006, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 1
Всего: 13



Цитата(Romikgy @  6.9.2006,  09:25 Найти цитируемый пост)
тогда это в кернеле32, есть такая ф-ция, можно динамически открыть ее через лоадлибрари и попросить адрес этой ф-ции

Добрался я таки и до этой части. В общем ты частично прав, в библиотеке kernel32.dll есть функция GetProcessId. Правда если в качестве параметра ей передавать результат возвращаемый функцией ShellExecute, то GetProcessId возвращает 0. Следовательно, не такой параметр ей требуется.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Romikgy
Дата 11.9.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

DWORD WINAPI GetProcessId(
  HANDLE Process
);

Код

HINSTANCE ShellExecute(

    HWND hwnd,    // handle to parent window
    LPCTSTR lpOperation,    // pointer to string that specifies operation to perform
    LPCTSTR lpFile,    // pointer to filename or folder name string
    LPCTSTR lpParameters,    // pointer to string that specifies executable-file parameters 
    LPCTSTR lpDirectory,    // pointer to string that specifies default directory
    INT nShowCmd    // whether file is shown when opened
   );

GetProcessId требует хендл процесса , а не его хистенс

Добавлено @ 08:56 
http://www.codeproject.com/win32/Remote.asp


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.