2011-03-01 31 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是一個開放源替代標籤,它可能有一個更好的算法,你可以使用...