Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
NotBeginner
148 / 148 / 19
Регистрация: 22.02.2013
Сообщений: 2,711
Записей в блоге: 2
#1

Получение Handle открытого окна - Delphi WinAPI

24.10.2016, 14:54. Просмотров 418. Ответов 1
Метки нет (Все метки)

Открываю окно - и мне надо получить его Handle
Делаю вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  SEInfo: TShellExecuteInfo;
  h : THandle;
  pid : cardinal;
begin
  ZeroMemory( @SEInfo, SizeOf(SEInfo));
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
  begin
     fMask :=  SEE_MASK_NOCLOSEPROCESS ;
     wnd := 0;
     lpParameters :=  PChar('::'+Str);
     lpFile  := 'explorer.exe';
     nShow := SW_SHOWNORMAL;
  end;
  if  not ShellExecuteEx(@SEInfo) then exit
  else
  begin
    WaitForSingleObject(SEInfo.hProcess, INFINITE);
    if EnumWindows(@EnumWind, SEInfo.hProcess) = false then exit;
  end;
 
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
function EnumWind(hwnd: HWND; lparam: LPARAM): BOOL;  stdcall;
var
  windowProcessId,
  searchedProcessId : DWORD;
begin
  Result := true;
  searchedProcessId := lparam;
  if not  IsWindow(hwnd) then exit;
  GetWindowThreadProcessId(hwnd, windowProcessId);
  if windowProcessId = searchedProcessId then
      Result := false;
end;
но видимо я путаю hProcess и ThreadProcessId

Добавлено через 1 час 17 минут
попробовал получить id процесса
Delphi
1
2
3
function GetProcessId(hp: HWND): DWORD; stdcall; external 'Kernel32.dll';
 
GetProcessId(SEInfo.hProcess) // не совпадает со значением из диспетчера задач
Добавлено через 1 час 8 минут
Переделал, под CreateProcess.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 if  CreateProcess(nil,
  PChar('explorer.exe ::'+Str),
                  //  Pchar('explorer.exe'),
                    @sa,
                    @sa,
                    False,
                    NORMAL_PRIORITY_CLASS ,
                    nil,
                    nil,
                    StartupInfo,
                    ProcessInformation) then
  begin
    if  WaitForInputIdle(ProcessInformation.hProcess, INFINITE) <> 0 then Exit;
   EnumThreadWindows(ProcessInformation.dwThreadId, @EnumProcedure, 0);
 
function EnumProcedure(hwnd: HWND; hwd: cardinal): BOOL;  stdcall;
begin
  Result := true;
 
  if IsWindowVisible(hwnd) then
    begin
      GlobalId := hwnd;
      Result := false;
    end;
end;
не ищет хендл если запустить мой компьютер
а при запуске например - калькулятора все ок

Добавлено через 14 часов 29 минут
суть вопроса в следующем, надо открывать папки : мой компьютер, мои документы и т.д
и у этих окон мне как то надо получить handle
вариант через FindWindow не подходит
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2016, 14:54     Получение Handle открытого окна
Посмотрите здесь:

Delphi WinAPI WinAPI окна
Delphi WinAPI Hook, изменение окна
Delphi WinAPI Получение информации о драйверах
Delphi WinAPI Получение информации о выполняемых процессах
Получение хендла контрола Delphi WinAPI
Как получить данные из TVirtualStringTree, зная его Handle? Delphi WinAPI
Получение информации из стороннего приложения Delphi WinAPI
Delphi WinAPI Получение координат значков на рабочем столе
Delphi WinAPI Как удалить объект, по его Handle
Получение данных из консольного приложения Delphi WinAPI
Получение THandle собственного сервиса Delphi WinAPI
Delphi WinAPI Как задать имя окна браузера Амиго для поиска дескриптора окна FindWindow

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jin X
Евгений
282 / 234 / 53
Регистрация: 14.12.2014
Сообщений: 671
25.10.2016, 16:18     Получение Handle открытого окна #2
Окна папок открывает explorer.exe, причём этот процесс не запускается дважды. Если explorer.exe уже запущен, повторно запускаемый процесс передаёт "главному" инфу о том, какое окно надо открыть и завершается. Как-то так. Поэтому неудивительно, что не удаётся найти окон повторно запускаемого explorer'а.

Так что, я думаю, надо найти запущенный процесс explorer.exe (хотя, по хорошему, имя этого файла/процесса лучше поискать в реестре, т.к. он может называться и по-другому) и дальше найти все его окна.

Прикрепляю 2 своих проги, которые я как-то давненько писал для изучения как раз работы с процессами/окнами (поиск заголовков, получение списков и т.д.). Если там порыться, можно найти то, что нужно. Исходники не громоздкие.
Вложения
Тип файла: zip TaskList.zip (8.0 Кб, 6 просмотров)
Yandex
Объявления
25.10.2016, 16:18     Получение Handle открытого окна
Ответ Создать тему
Опции темы

Текущее время: 19:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru