Я вызываю другую Программу, которая отображает только веб-страницу, подобную этой:
Проблема: если я создаю процесс с помощью кнопки, и, в то время как созданный процесс открыт, я нажимаю флажок на вызывающемФорма, я закрываю созданный процесс, флажок установлен.
Я пытался использовать DisableTaskWindows (0), как показано в функции .ShowModal.Но это не работает, как я ожидал.Пока он отключает форму.Но после того, как я включил его, похоже, что форма все равно обрабатывает событие click.Вроде как если есть очередь сообщений или что-то в этом роде.
Может кто-нибудь сказать мне, что я делаю здесь не так?
procedure TForm1.Button1Click(Sender: TObject);
var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
ProcessCreated : Boolean;
CommandLine : string;
WindowList: TTaskWindowList;
begin
WindowList := DisableTaskWindows(0);
CommandLine:='webmodule.exe';
uniqueString(CommandLine);
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
StartupInfo.cb := SizeOf(StartupInfo);
ProcessCreated := CreateProcess(PChar(nil), PChar(CommandLine), nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo);
if ProcessCreated then
WaitForSingleObject(ProcessInfo.hProcess, INFINITE)
else
ShowMessage('Error : could not execute!');
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
EnableTaskWindows(WindowList);
end;
ОБНОВЛЕНИЕ
к сожалению, я не уверен, как использовать функцию RegisterWaitForSingleObject ... Я пробовал это, но не работает.Может быть, мне не хватает CallBack?Но я понятия не имею, как его использовать.
if ProcessCreated then
begin
// WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
while (RegisterWaitForSingleObject(ProcessInfo.hProcess,ProcessInfo.hProcess,nil,nil,INFINITE,0) = false) do
begin
Form1.Color:=RGB(random(255),random(255),random(255));
Application.ProcessMessages;
end;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end
else
ShowMessage('Error : could not execute!');
ОБНОВЛЕНИЕ 2:
Я думаю, что, возможно, решил это, я удалил Enable Disable для формы,Вместо этого я делаю это после того, как выполнил процесс.
while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE or PM_NOYIELD) do;