Я вызываю другую программу, которая отображает только такую веб-страницу:
Проблема: если я создаю процесс с помощью кнопки, и пока созданный процесс открыт, я нажимаю на флажок в форме вызова, я закрываю созданный процесс, флажок установлен.
Я попытался использовать DisableTaskWindows(0), как показано в функции .ShowModal. Но это не работает, как я ожидал. Хотя он отключает форму . Но после того, как я включу его, кажется, что форма все равно обрабатывает событие клика. Вроде как, если у него есть очередь сообщений или что-то в этом роде.
Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?
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 для формы. Вместо этого я делаю это после выполнения Process .
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;
Enabledвызывающей формы вместо использования(Disable|Enable)TaskWindows()? Я бы даже предложил использоватьRegisterWaitForSingleObject()или аналогичный, чтобы позволить коду вернуть управление основному циклу обработки сообщений во время ожидания порожденного процесса, а затем позволить функции обратного вызова ожидания закрыть открытые дескрипторы и повторно включить форму - person Remy Lebeau   schedule 07.02.2019RegisterWaitForSingleObjectзаключалась в том, чтобы изменить код так, чтобы он выполнялся асинхронно. ЕслиCreateProcessзавершается успешно, вызовитеRegisterWaitForSingleObjectодин раз, а затем немедленно выйдите изButton1Click. В фоновом режиме ОС продолжит ожидание порожденного процесса, и когда он завершится, вы получите уведомление через обратный вызов. Таким образом, вы можете позволить основному циклу сообщений продолжать работать в обычном режиме, и он будет поглощать пользовательский ввод, пока форма отключена, до тех пор, пока процесс не завершится и форма не будет снова включена. НЕ пытайтесь делать все внутриButton1Click. - person Remy Lebeau   schedule 07.02.2019RegisterWaitForSingleObject()указатель на функцию, ОС вызывает эту функцию, когда запрошенный дескриптор получает сигнал (когда порожденный процесс завершается). Вы не ждете обратного вызова, вы идете дальше и позволяете функции вызываться позже. - person Remy Lebeau   schedule 08.02.2019