2016-05-15 36 views
1

是否有WinAPI函數來檢索任務欄的句柄?獲取句柄到任務欄

目的是確定任務欄停靠設置(ABE_LEFT,ABE_RIGHT,ABE_BOTTOM,ABE_TOP)。函數SHAppBarMessage要求任務欄句柄檢索停靠信息。除非有另一種方法來確定任務欄停靠設置而不需要處理?

我知道這個方法,工作正常,但我不知道它適用於所有的Windows版本:

HWND taskBar = FindWindow("Shell_TrayWnd", NULL); 
+0

到Windows 7(含),應該可以工作。 Windows 8及更高版本,其改變。請參閱[此問題](http://stackoverflow.com/questions/9569620/how-do-i-get-a-handle-to-the-start-button-in-windows-7)以獲取更多信息。 – t0mm13b

回答

1

這似乎是一個文檔錯誤。當撥打SHAppBarMessage1)時,您不需要在結構中爲ABM_GETTASKBARPOS提供窗口句柄。

下面的代碼正確返回任務欄的位置(在Windows 10的x64測試):

#include <shellapi.h> 
#pragma comment(lib, "Shell32.lib") 
#include <stdexcept> 

RECT GetTaskbarPos() { 
    APPBARDATA abd = { 0 }; 
    abd.cbSize = sizeof(abd); 
    if (!::SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) { 
     throw std::runtime_error("SHAppBarMessage failed."); 
    } 
    return abd.rc; 
} 

更新:這個問題是真的要求對接枚舉值。即返回以及:

#include <shellapi.h> 
#pragma comment(lib, "Shell32.lib") 
#include <stdexcept> 

UINT GetTaskbarDockingEdge() { 
    APPBARDATA abd = { 0 }; 
    abd.cbSize = sizeof(abd); 
    if (!::SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) { 
     throw std::runtime_error("SHAppBarMessage failed."); 
    } 
    return abd.uEdge; 
} 


1) 如果你需要在任務欄的隱藏的很好的窗口句柄來發送這個信息,這會很尷尬。如果您已經擁有窗戶把手,則可以簡單地撥打GetWindowRect

+0

我想知道當任務欄在多個監視器上時它是如何處理的。 –

+1

@JonathanPotter:這隻會檢索主顯示的任務欄位置。要在其他顯示器上獲取任務欄位置,請改爲調用[GetMonitorInfo](https://msdn.microsoft.com/en-us/library/dd144901.aspx)。 – IInspectable

+0

@JonathanPotter:當調用'GetMonitorInfo'時,你必須自己完成對接。它不是[MONITORINFO](https://msdn.microsoft.com/en-us/library/dd145065.aspx)結構的一部分。 – IInspectable