Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
Zyablik3000

Получение хэндла главной формы приложения из другой программы

Вопрос

Здравствуйте!

Есть VCL приложение с кодом:

function GetWindow(Handle: Cardinal; LParam: longint): bool;
begin
  Result:= true;
  WindowList.Add(Pointer(Handle));
end;

function TFileOperationsThread.GetHandles(ThreadID: Cardinal): Cardinal;
var
  i: integer;
  hnd : Cardinal;
  cpid : DWord;
begin
  Result:=0;
  WindowList := TList.Create;
  EnumWindows (@GetWindow, 0);
  for i := 0 to WindowList.Count - 1 do
  begin
    hnd := HWND(WindowList[i]);
    GetWindowThreadProcessID (hnd, @cpid);
    if ThreadID = CPID then
    begin
      Result := hnd;
      WindowList.Free;
      Exit;
    end;
  end;
  WindowList.Free;
end;

procedure TFileOperationsThread.Execute;
var
  SEInfo: TShellExecuteInfo;
  StartInfo: TStartupInfo;
  ProcInfo: _PROCESS_INFORMATION;
  AppHandle: THandle;
begin
  StartInfo.cb:=SizeOf( StartupInfo);
  StartInfo.dwFlags:=STARTF_USESHOWWINDOW;
  StartInfo.wShowWindow:=SW_SHOW;
  if FileExists(FFileInfo.FullFileName) then
  begin
    if CreateProcess(PChar(FFileInfo.FullFileName),
                     PChar(FFileInfo.FullFileName),
                     nil,
                     nil,
                     False,
                     NORMAL_PRIORITY_CLASS,
                     nil,
                     nil,
                     StartInfo,
                     ProcInfo) then
    begin
      WaitForInputIdle(ProcInfo.hProcess, INFINITE);
      AppHandle:=GetHandles(ProcInfo.dwProcessId)
      SendMessage(FFormHandle, WM_NEED_CHANGE_STATE, WPARAM(AppHandle), SMP_WINDOW_HANDLE);
      CloseHandle(ProcInfo.hProcess);
      CloseHandle(ProcInfo.hThread);
    end;
  end;
end;

Код нормально запускает приложение написанное на Firemonkey.

Но функция GetHandles возвращает некое число, которое НЕ равно ни ApplicationHWND, ни FormToHWND(Self) firemonkey приложения.

Функция WaitForInputIdle возвращает 0.

Проблема решается заменой WaitForInputIdle(ProcInfo.hProcess, INFINITE); на Sleep(500); В AppHandle получаю значение равное FormToHWND(Self) firemonkey приложения.

А теперь вопрос: Подскажите плиз как получить Виндовый хендл главной формы Firemonkey-приложения после его запуска и что это за неизвестное число, которое получаю в AppHandle:=GetHandles(ProcInfo.dwProcessId).

Не хочется использовать FindWindow.

 

Изменено пользователем Zyablik3000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

Ответы на этот вопрос пока отсутствуют

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...