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

Delphi и WinAPI

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

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

24.10.2016, 14:54. Просмотров 478. Ответов 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 открытого окна
Посмотрите здесь:

Как удалить объект, по его Handle - Delphi WinAPI
Как, зная Хендл объекта чужого приложения, удалить его?

Как получить данные из TVirtualStringTree, зная его Handle? - Delphi WinAPI
Как прочитать данные первой колонки из TVirtualStringTree, зная его Handle. Для ListView делал так (правда в чужом процессе): ...

Получение информации о драйверах - Delphi WinAPI
Здравствуйте. Помогите пожалуйста с курсовой работой. Задание. Разработать многопоточное приложение, выполняющее следующие операции: 1)...

Получение хендла контрола - Delphi WinAPI
Delete

.NET 4.x Excel Interop 15, получение открытого окна - C#
При работе с интероп все обычно начинается с Excel.Application app = new Excel.Application(); , у меня появился вопрос, можно ли...

Получение текста HTML из уже открытого окна IE - Visual Basic .NET
Есть задача получить HTML код страницы (с конкретной страницы) из уже открытого окна IE, после Document_complite естественно (к IE...

поиск Handle окна, зная ControlId окна - C++
вопрос по сабжу

Активация открытого окна - Web
Я использую аргумент TARGET тэга &lt;A&gt; для открытия страници инструкции в отдельном окне, чтобы инструкция не открывалась каждый раз в новом...

Получение Handle запущенного процесса - Delphi
Доброго всем дня. Уважаемые, подскажите пожалуйста, что я не так делаю, мне нужно получить хендл запущенного процесса, и... я его получаю,...

.NET 3.x Поиск открытого окна в цикле - C#
Не могу сделать проверку открытого окна: То есть, если окно открыто то делаем какое-либо действо, если окно не открыто то запускаем цикл...

Handle окна - C#
Привет всем. Хотел бы чтобы программа получила доступ к игре Gta san Andreas ( для игры по сети через клиент Samp ). В игре через клиент...

Handle окна - C++ Qt
Как мне получить чужой процесс айди? В винапи это делается через 2 строчки, неужели в qt нет инструментов для этого?


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jin X
Евгений, Самара
729 / 360 / 79
Регистрация: 14.12.2014
Сообщений: 948
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 открытого окна
Ответ Создать тему
Опции темы

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