2016-05-15 66 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