【发布时间】:2020-04-28 19:05:33
【问题描述】:
大家早上好, 我写了一个非常简单的应用程序,我必须等待用户按下一个键(例如 F2)才能继续处理。按下按钮的等待周期完美运行,但我需要帮助的问题是:如果在按下按钮的等待周期中,我点击了另一个应用程序,我的应用程序失去焦点,我无法再重新获得控制权。 即使我单击应用程序的任何部分,表单的标题始终保持灰色,应用程序仍在等待按键的压力,如果我按下所需的按键,显然没有任何反应。 如何重新获得对应用程序的控制权?我想我会在 while 循环中放入 SetFocus、StayOnTop、SetForegroundWindow 等指令,以始终保持我的应用程序处于活动状态,但我无法组合任何东西......代码如下:
var
Form2: TForm2;
mkey: word;
implementation
{$R *.dfm}
procedure TForm2.FormActivate(Sender: TObject);
begin
label1.Visible:= false;
mkey:= 0;
keyPreview:= true;
while mkey <> VK_F2 do begin
label1.Visible:= true;
label1.Caption:= datetimetostr(now); // for example
application.ProcessMessages;
end;
label1.Visible:= false;
end;
procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
mkey:= key;
end;
end.
【问题讨论】:
-
操作系统是事件驱动的。不要在循环中等待,而是使用按键事件来执行任务的下一步。寻找状态机。
-
没有跟踪,但显然问题的一部分是 WM_ACTIVATE 永远不会返回。默认窗口过程应该将焦点设置在您的表单上,由于您的循环,它永远不会被调用(或返回)。 ..由于您没有焦点,因此无法按 F2 或任何其他键。
标签: loops delphi while-loop key keypress