Перейти к содержанию
Fire Monkey от А до Я
  • 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 пользователей онлайн

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