2011-03-01 95 views
0

Windows API有一个名为GetForegroundWindow的方法。 但是,当您点击它时,它会将桌面视为前景窗口。 我们都知道,当它发生时,以前的前景窗口不会被它叠加。 如何获得真正的前景窗口句柄?如何在Windows上获取前景窗口?

+3

假设您在桌面上有两个可见的窗口。点击桌面后,哪一个是“真正的”前景窗口? – 2011-03-01 19:29:04

+1

这将有助于知道你想要达到的目标。你写的问题没有意义。 – 2011-03-01 20:03:47

+0

这绝对不是正常的行为,在我的任何机器上都没有见过。注意尝试模拟桌面的'附加组件'。 – 2011-03-01 20:04:38

回答

3

我想你是在过度工程你的解决方案。如果您的应用程序窗口在您收到更新时不是前台窗口,请将该窗口刷新。闪烁的目的是捕捉用户的注意力,并且您无法确定您是否以编程方式注意到他们的注意力。

看起来你真正想知道的是:“我的窗口部分是否可以对用户显示?”这是一个相当复杂的问题,即使您正确回答,您也无法知道用户是否会注意到这一变化。

+0

的社区指南是什么,我只是想实现它,因为我测试了另一个应用程序(Google Talk),它的工作原理与我描述的一样。 – 2011-03-02 00:05:03

+0

@Jader:即使你决心要做到这一点,找到“前景”窗口并不是要走的路 - 正如Peter在他对你的问题的评论中指出的那样,可能有不止一个(而且他们可能不是无论如何都会遮住你的*窗口)。如果你只是想知道用户能否看到你的窗口,我怀疑检查剪切区域(对于你的**窗口)是要走的路......但这是另一个问题的主题。 – Shog9 2011-03-04 02:07:36

1

两个“桌面”(探险桌面上的真正的桌面窗口的顶部列表视图)和任务栏是真正的Windows这里可能是“工作”的用户(Tab'ing左右,使用菜单等)

如果你想找到坏你必须自己找到它的“真正的”前台窗口,最好的办法是在Z顺序的顶部会为窗口,也许是这样的:

... enumfunc(hwnd,...) 
{ 
    if (GetClassName(hwnd)!= "Shell_TrayWnd") 
    { 
     if (IsWindowEnabled(hwnd) && IsWindowVisible(hwnd) && GetWindow(hwnd,GW_OWNER)==NULL) 
     { 
      DoSomethingWithRealForegroundWindow(hwnd) 
      return FALSE 
     } 
    } 
} 

EnumWindows(enumfunc,0) 

TaskSwitchXP是一个开放源替代标签,它可能有一个更好的算法,你可以使用...