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

Поиск:

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


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


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

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



Цитата(Yanis @  14.9.2006,  08:29 Найти цитируемый пост)
P. S. А вопрос то решён или вы за так ликбез устроили?

А че? человек спрашает , я отвечаю smile


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

PM   Вверх
Yanis
Дата 14.9.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(Romikgy @  14.9.2006,  11:34 Найти цитируемый пост)
А че? человек спрашает , я отвечаю

Просто интересно стало. Тема досих пор не тонет и вопрос вроде не помечен как решённый.

P. S. Вдруг я тоже хочу поучавствовать smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Fedia
Дата 17.9.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Yanis @  14.9.2006,  09:29 Найти цитируемый пост)
P. S. А вопрос то решён или вы за так ликбез устроили?

Оказалось, что вопрос скорее всего не имеет решения smile. Обходные пути есть (CreateProcess, ShellExecuteEx), а напрямую, после ShellExecute, по результатам этой функции получить перечень хэндлов окон запущенного приложения ни как. Таки помечу тему как решенную, дабы не вводить в заблуждение массы  smile



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


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


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

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



Еще одно предложение, напоследок, правда оно не будет иметь отношения к 
Цитата(Fedia @  17.9.2006,  22:57 Найти цитируемый пост)
ShellExecute

им только запускаешь файл,
а потом делаешь снимок всех процессов, и отбираешь те нужный по имени ехе файла, после этого перечисляешь все окна данного процесса и находишь нужно те окно ,и в конце получается и волки  сыты и овцы целы, т.е. юзаешь shellexecute и получаешь хендл окна  smile 


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

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


Опытный
**


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

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



Romikgy, это решение уже есть в моей копилке. Обсуждалось здесь.  smile 


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


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


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

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



Цитата(Fedia @  17.9.2006,  23:17 Найти цитируемый пост)
это решение уже есть в моей копилке.

ну как знаешь  smile 


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

PM   Вверх
Yanis
Дата 18.9.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(Fedia @  18.9.2006,  00:57 Найти цитируемый пост)
Обходные пути есть (CreateProcess, ShellExecuteEx), а напрямую, после ShellExecute, по результатам этой функции получить перечень хэндлов окон запущенного приложения ни как.

Так вот, что требуется то smile Я вот попробовал тут набросать немного кода.
Код
{ стили overlapped окон }
const
  aTrueWndStyles: array[1..6] of DWORD = (WS_OVERLAPPED, WS_POPUP, WS_MINIMIZE,
                                          WS_THICKFRAME, WS_CAPTION, WS_SYSMENU);

function EnumThreadWndProc(hwnd: DWORD; lParam: Integer): Boolean; stdcall;

{ ... }

function GetWindowText(hWnd: HWND): string;
begin
  SetLength(Result, MAX_PATH);
  Windows.GetWindowText(hWnd, Pchar(Result), MAX_PATH);
  Result := StrPas(Pchar(Result));
end;

function EnumThreadWndProc(hwnd: DWORD; lParam: Integer): Boolean; stdcall;
var
  dwWndStyle: DWORD;
  i: Integer;
begin
  Result := True;

  dwWndStyle := GetWindowLong(hwnd, GWL_STYLE);

  { теоретически, если в стиле окна есть хотя бы один из перечисленных флагов, то
    это overlapped окно }

//  if (((dwWndStyle and WS_OVERLAPPED) = WS_OVERLAPPED) or
//    ((dwWndStyle and WS_POPUP) = WS_POPUP) or
//    ((dwWndStyle and WS_MINIMIZE) = WS_MINIMIZE) or
//    ((dwWndStyle and WS_THICKFRAME) = WS_THICKFRAME) or
//    ((dwWndStyle and WS_CAPTION) = WS_CAPTION) or
//    ((dwWndStyle and WS_SYSMENU) = WS_SYSMENU)) and
//    ((dwWndStyle and WS_VISIBLE) = WS_VISIBLE) then

  for i := Low(aTrueWndStyles) to High(aTrueWndStyles) do
    if ((dwWndStyle and aTrueWndStyles[i]) = aTrueWndStyles[i]) and
       ((dwWndStyle and WS_VISIBLE) = WS_VISIBLE) then
        begin
          Form1.ListBox1.Items.Add(GetWindowText(hwnd) + ' - ' + IntToHex(hwnd, 8));
          Break;
        end;
end;

var
  hWnd: DWORD;
  pi: TProcessInformation;
  si: TStartupInfo;
begin
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));

  CreateProcess(nil, 'notepad.exe', nil, nil, False, NORMAL_PRIORITY_CLASS, nil,
    nil, si, pi);

  WaitForInputIdle(pi.hProcess, INFINITE);
  Application.MessageBox(PChar('Приступаем к перечислению окон.'+#13#10+
                               'Для продолжения нажмите OK'), nil, MB_ICONWARNING or MB_SYSTEMMODAL);

  EnumThreadWindows(pi.dwThreadId, @EnumThreadWndProc, 0);

  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;


При запуске будет выдано окошко с сообщением, что сейчас будут перечислены окна запущенного процесса notepad.exe. Для большей наглядности можно в запустившемся окне Блокнота сначала вызвать окно замены (Ctrl+H) и плюс к этому вызвать пункт меню Открыть. В этом случае будут перечислены 3 дочерних окна (а точнее их текст, полученый через GetWindowText) и их описатели. У меня это выглядит так:
Цитата
Открыть - 00D10DB4
Замена - 00470A1A
Безымянный - Блокнот - 00740AA2

При проверке учитывается тот факт, что окно что бы быть окном должно иметь хотя бы один флаг среди флагов перечисленных в aTrueWndStyles и иметь флаг WS_VISIBLE. 
Код не универсальный и он умеет определять окна только одного потока, ID которого возвращается в pi.dwThreadId. Конечно для универсальности нужно определять окна всех потоков. Для этого придётся немного усложнить код и получить ID всех потоков и уже для каждого вызвать EnumThreadWindows. Получить список всех потоков процесса можно через функцию CreateToolhelp32Snapshot с флагом TH32CS_SNAPTHREAD и далее перечислить их из получившегося снимка при помощи Thread32First & Thread32Next.

P. S. Извиняюсь, если боян smile
P. S. S. Коментарии не писал. Код довольно прозрачный smile

Это сообщение отредактировал(а) Yanis - 18.9.2006, 14:40


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Fedia
Дата 26.9.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Yanis @  14.9.2006,  10:39 Найти цитируемый пост)
Тема досих пор не тонет

Вот и потонула ветка smile. Извиняюсь, что долго не отвечал. Занят был сильно, а этот вопрос у меня совсем не приоритетный. Хороший пример, хоть и не совсем в тему.
А через ShellExecuteEx тоже самое реализовать сможешь ? Я пробовал так:
Код

function EnumWindowsProc(h: HWND; lp: LPARAM): BOOL; stdcall;
var
  sx, str: string;
  pid,pidreq: DWORD;
begin
  SetLength(sx,300);

  GetWindowThreadProcessId(h, pid);
  GetWindowText(h,PChar(sx),255);
  if (pid=DWORD(lp)) then
  if  IsWindowEnabled(h) then
    Form1.ListBox1.Items.Add(IntToHex(h,8)+' '+inttostr(pid)+' '+strpas(PChar(sx)));

  Result:=True;
end;

procedure GetHWND_from_Histance(PId: Cardinal);
var
  c1:Cardinal;
  pe:TProcessEntry32;
  histan: HMODULE;
  s1:string;
  x:integer;
begin
  c1:=CreateToolHelp32Snapshot(TH32CS_SNAPALL, 0);
  if c1=INVALID_HANDLE_VALUE then
  exit;

  try
    pe.dwSize:=sizeof(pe);
    if Process32First(c1, pe) then
    repeat
      if  pe.th32ParentProcessID = PId then
      begin
        EnumWindows(@EnumWindowsProc,pe.th32ProcessID);
        Break;
      end;
    until not Process32Next(c1,pe);
  finally
    CloseHandle(c1);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
type
  TGetPId = function (Process: HWND): DWORD;
var
  SEInfo: TSHELLEXECUTEINFO;
  Ar: TIntegerDynArray;
  TopW: HWND;
  pi: TProcessInformation;
  si: TStartupInfo;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize:=SizeOf(SEInfo);
  SEInfo.Wnd:=Application.Handle;
  SEInfo.fMask:=SEE_MASK_NOCLOSEPROCESS;
  SEInfo.lpFile:='C:\test.exe';
  SEInfo.nShow:=SW_SHOWNORMAL;
  ShellExecuteEx(@SEInfo);

  GetHWND_from_Histance(SEInfo.hProcess);
end;
, но это пример не работает из-за того, что th32ParentProcessID и hProcess не одно и тоже. А как получить из hProcess - th32ProcessID не знаю.


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


sceloglauxalbifacies
****


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

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



Fedia, для нормальной работы с хэндлами таки стоит использовать CreateProcess. почему? - вот цитата из MSDN по SHELLEXECUTEINFO.hProcess:
Цитата(MSDN)

hProcess
Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(Fedia @  26.9.2006,  01:37 Найти цитируемый пост)
Хороший пример, хоть и не совсем в тему.

Почему? Потому что пример с CreateProcess, а не с ShellExecute(Ex)?
Ну да ладно...

Вобщем тебе выбирать каким способом пользоваться. Проблема
Цитата(Fedia @  26.9.2006,  01:37 Найти цитируемый пост)
А как получить из hProcess - th32ProcessID не знаю.

решается с помощью функции GetProcessId. Присутствует она начиная с XP, поэтому даже в 2000 работать уже не будет.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Fedia
Дата 26.9.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, 
Ага, читал я справку MSDN по SHELLEXECUTEINFO. И судя по ней в моих задачах hProcess будет не NULL. А в большей эффективности использования CreateProcess я убедился после того, как стало понятно, что ShellExecute(Ex) все равно вызывают CreateProcess. Поэтому полностью с тобой согласен  smile 

Yanis, 
Цитата(Yanis @  26.9.2006,  09:32 Найти цитируемый пост)
Почему? Потому что пример с CreateProcess, а не с ShellExecute(Ex)?
Ну да ладно...

Нет, вопрос в этой ветке изначально звучал даже уже, и касался он только ShellExecute. Единственно, что мне необходимо было узнать в этой ветке, это то, что результат ShellExecute для решения задачи использовать не получиться. А за твой пример отдельное спасибо.

Цитата(Yanis @  26.9.2006,  09:32 Найти цитируемый пост)
решается с помощью функции GetProcessId.

Ах да, мне же эту функцию Romikgy уже приводил, сорри.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Страницы: (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.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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