Delphi 如何检查我的应用程序是否有焦点?

Delphi 如何检查我的应用程序是否有焦点?,delphi,winapi,vcl,notification-area,Delphi,Winapi,Vcl,Notification Area,我想做的是检查我的应用程序是否有焦点,因为如果没有焦点,我将在通知区域上方弹出一个警报窗口,向最终用户显示一些消息。如果应用程序由单个表单组成,则 GetForegroundWindow = Handle 就够了。当且仅当窗体是前景窗口时,即当键盘焦点属于此窗体上的控件(或窗体本身)时,上述表达式才成立 如果您的应用程序由许多表单组成,只需循环检查它们是否匹配getForeGroundIndow调用Windows.getForeGroundIndow(),然后将HWND传递给控件.FindCo

我想做的是检查我的应用程序是否有焦点,因为如果没有焦点,我将在通知区域上方弹出一个警报窗口,向最终用户显示一些消息。

如果应用程序由单个表单组成,则

GetForegroundWindow = Handle
就够了。当且仅当窗体是前景窗口时,即当键盘焦点属于此窗体上的控件(或窗体本身)时,上述表达式才成立


如果您的应用程序由许多表单组成,只需循环检查它们是否匹配
getForeGroundIndow

调用
Windows.getForeGroundIndow()
,然后将
HWND
传递给
控件.FindControl()
函数。如果
HWND
属于您的进程,它将返回一个非nil
TWinControl
指针。例如:

if FindControl(GetForegroundWindow()) <> nil then
  // has focus ...
else
  // does not have focus ...
如果FindControl(getForeGroundIndow())为nil,则
//有焦点。。。
其他的
//没有焦点。。。

Remys响应的细微变化是:

Var
  Win: TWinControl;
Begin
  Win := FindControl(GetForegroundWindow);
  if Win <> nil then
//      StringGrid1.Row :=5;
//      StringGrid1.SetFocus;
Var
赢:双控;
开始
Win:=FindControl(GetForegroundWindow);
如果赢了,那就输了
//StringGrid1.行:=5;
//StringGrid1.SetFocus;

编译对我来说还可以,但我发现它在调试期间不可靠,即使窗口没有聚焦导致错误,也会调用stringgrid.setfocus

D2007有这个有用的属性

if Application.Active then
//