【问题标题】:How can I check if my application has focus?如何检查我的应用程序是否有焦点?
【发布时间】:2011-04-12 08:53:38
【问题描述】:

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

【问题讨论】:

    标签: delphi winapi vcl notification-area


    【解决方案1】:

    调用Windows.GetForegroundWindow(),然后将HWND 传递给Controls.FindControl() 函数。如果HWND 属于您的进程,它将返回非零TWinControl 指针。例如:

    if FindControl(GetForegroundWindow()) <> nil then
      // has focus ...
    else
      // does not have focus ...
    

    【讨论】:

      【解决方案2】:

      D2007 有这个有用的属性

      if Application.Active then
      //
      

      【讨论】:

        【解决方案3】:

        如果您的应用程序由单个表单组成,那么

        GetForegroundWindow = Handle
        

        就足够了。当且仅当您的表单是前台窗口时,上面的表达式才为真,也就是说,如果键盘焦点属于该表单上的控件(或属于表单本身)。

        如果您的应用程序包含多个表单,只需遍历它们并检查它们是否与GetForegroundWindow 匹配。

        【讨论】:

          【解决方案4】:

          Remys 的反应略有不同:

          Var
            Win: TWinControl;
          Begin
            Win := FindControl(GetForegroundWindow);
            if Win <> nil then
          //      StringGrid1.Row :=5;
          //      StringGrid1.SetFocus;
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-07
            • 2016-07-25
            • 1970-01-01
            • 2016-04-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多