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

Delphi и WinAPI

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

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

24.10.2016, 14:54. Просмотров 531. Ответов 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 не подходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2016, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение Handle открытого окна (Delphi WinAPI):

Программа для прослушивания открытого порта. - Delphi
В общем есть приложение - которое открыло порт и общается по нему... Могу ли я Написать прогу - которая бы могла 'прослушивать' этот порт...

Handle у Image - Delphi
Подскажите пожалуйста как узнать Handle у картинки:)

На счет handle - Delphi
Пишу защиту для одной онлайн игры Lineage 2, на руоффе нельзя взять handle окна, как можно подобное реализовать? Добавлено через 8...

Handle запускаемого файла - Delphi
Доброго времени суток. У меня такой вопрос, как можно узнать Хэндл запускаемого файла? Или просто активного окна хотябы?

PostMessage(Handle, WM_CLOSE, 0, 0); - Delphi
Может я совсем глупый... Обрабатываю я некоторую информацию в OnShow формы и выясняю, что форму показывать оказывается совсем не...

Как из Дельфи обратиться к свойству открытого в OpenOffice документа? - Delphi
Подскажите пож. как из Делфи обратиться к свойству открытого в OpenOffice документа? есть пример для вставки текста по метке (Закладке),...

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

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

Прикрепляю 2 своих проги, которые я как-то давненько писал для изучения как раз работы с процессами/окнами (поиск заголовков, получение списков и т.д.). Если там порыться, можно найти то, что нужно. Исходники не громоздкие.
2
Вложения
Тип файла: zip TaskList.zip (8.0 Кб, 6 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2016, 16:18
Привет! Вот еще темы с ответами:

Как найти handle Рабочего стола? - Delphi
Как найти в Delphi7 handle Рабочего стола? (это нужно, когда в проекте нет форм, и проект запускает другую программу командой...

Как зная Handle обратиться к объекту ? - Delphi
И вообще можно ли так ?

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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