【发布时间】:2011-04-12 08:53:38
【问题描述】:
我要做的是检查我的应用程序是否有焦点,因为如果没有,我将在通知区域上方弹出一个警报窗口,向最终用户显示一些消息。
【问题讨论】:
标签: delphi winapi vcl notification-area
我要做的是检查我的应用程序是否有焦点,因为如果没有,我将在通知区域上方弹出一个警报窗口,向最终用户显示一些消息。
【问题讨论】:
标签: delphi winapi vcl notification-area
调用Windows.GetForegroundWindow(),然后将HWND 传递给Controls.FindControl() 函数。如果HWND 属于您的进程,它将返回非零TWinControl 指针。例如:
if FindControl(GetForegroundWindow()) <> nil then
// has focus ...
else
// does not have focus ...
【讨论】:
D2007 有这个有用的属性
if Application.Active then
//
【讨论】:
如果您的应用程序由单个表单组成,那么
GetForegroundWindow = Handle
就足够了。当且仅当您的表单是前台窗口时,上面的表达式才为真,也就是说,如果键盘焦点属于该表单上的控件(或属于表单本身)。
如果您的应用程序包含多个表单,只需遍历它们并检查它们是否与GetForegroundWindow 匹配。
【讨论】:
Remys 的反应略有不同:
Var
Win: TWinControl;
Begin
Win := FindControl(GetForegroundWindow);
if Win <> nil then
// StringGrid1.Row :=5;
// StringGrid1.SetFocus;
对我来说编译正常,但我发现它在调试期间不可靠,即使窗口没有聚焦导致错误,也会调用 stringgrid.setfocus。
【讨论】: