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).
Вопрос
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.
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.