Winapi 如何在Windows上获取前景窗口?

Winapi 如何在Windows上获取前景窗口?,winapi,window,Winapi,Window,Windows API有一个名为GetForegroundWindow的方法。 但当你点击桌面时,它会将桌面视为前台窗口。 我们都知道,当它发生时,前一个前景窗口不会被它叠加。 如何获得真正的前台窗口句柄?桌面(位于真正桌面窗口顶部的Explorers desktop listview)和任务栏都是用户可能正在“工作”的真正窗口(使用菜单等四处搜索) 如果你想找到你自己找到的“真实”前景窗口,你最好的选择是在z顺序的顶部找到窗口,可能类似于: ... enumfunc(hwnd,...) {

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

桌面(位于真正桌面窗口顶部的Explorers desktop listview)和任务栏都是用户可能正在“工作”的真正窗口(使用菜单等四处搜索)

如果你想找到你自己找到的“真实”前景窗口,你最好的选择是在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)
是一个开源的alt tab替代品,它可能有一个更好的算法,您可以使用…

无论是“桌面”(位于真实桌面窗口顶部的Explorers desktop listview)还是任务栏都是用户可能正在“工作”的真实窗口(使用菜单等四处搜索)

如果你想找到你自己找到的“真实”前景窗口,你最好的选择是在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)

是一个开源的alt标签替代品,它可能有一个更好的算法,你可以使用…

我认为你在过度设计你的解决方案。如果收到更新时应用程序窗口不是前台窗口,则刷新窗口。闪烁的目的是捕捉用户的注意力,而您无法确定是否以编程方式获得了他们的注意力


似乎您真正想知道的是:“我的窗口中更改的部分当前对用户可见吗?”这是一个非常复杂的问题,即使您回答正确,您也无法知道用户是否会注意到更改。

我认为您的解决方案设计过度。如果收到更新时应用程序窗口不是前台窗口,则刷新窗口。闪烁的目的是捕捉用户的注意力,而您无法确定是否以编程方式获得了他们的注意力


似乎您真正想知道的是:“我的窗口中更改的部分当前对用户可见吗?”这是一个非常复杂的问题,即使您回答正确,您也无法知道用户是否会注意到更改。

假设桌面上有两个可见窗口。在你点击桌面后,哪一个是“真正的”前台窗口?了解你想要实现的目标会很有帮助。你的问题,如文中所述,毫无意义。这肯定不是正常行为,在我的任何机器上都没有见过。小心那些试图模拟桌面的“附加组件”。我删除了
GetForegroundWindow
标记,因为我们真的不希望每个win api方法都有一个标记。如果您认为标记仍然合适,请还原。@Peter我想知道是否需要闪烁指示更新的任务栏图标,或者用户是否已经看到更新。如果桌面上有两个可见窗口,请返回。在你点击桌面后,哪一个是“真正的”前台窗口?了解你想要实现的目标会很有帮助。你的问题,如文中所述,毫无意义。这肯定不是正常行为,在我的任何机器上都没有见过。小心那些试图模拟桌面的“附加组件”。我删除了
GetForegroundWindow
标记,因为我们真的不希望每个win api方法都有一个标记。如果您认为标记仍然合适,请还原。@Peter我想知道是否需要刷新指示更新的任务栏图标,或者用户是否已经看到更新,我只是想实现它,因为我测试了另一个应用程序(Google Talk),它可以如我所述工作。@Jader:即使您决定这样做,也要找到“前台”窗口不是一条路——正如彼得在评论你的问题时所指出的,可能不止一条(而且它们可能不会遮住你的窗口)。如果你只是想知道用户是否能看到你的窗口,我怀疑检查剪辑区域(你的窗口)是一种方法。。。但这是另一个问题的主题。我只想实现它,因为我测试了另一个应用程序(Google Talk),它可以像我描述的那样工作。@Jader:即使你决心这么做,找到“前景”窗口也不是一条路——正如Peter在对你的问题的评论中所指出的,可能不止一条如果你只是想知道用户是否能看到你的窗口,我怀疑检查剪辑区域(你的窗口)是一个好办法……但这是另一个问题的主题。