【问题标题】:Obtain Handle to Task Bar获取任务栏句柄
【发布时间】:2016-05-15 23:49:29
【问题描述】:

是否有用于检索任务栏句柄的 WinAPI 函数?

目的是确定任务栏停靠设置(ABE_LEFT、ABE_RIGHT、ABE_BOTTOM、ABE_TOP)。函数SHAppBarMessage 需要任务栏句柄来检索对接信息。除非有另一种方法来确定不需要手柄的任务栏停靠设置?

我知道这种方法可以正常工作,但我不确定它是否适用于所有 Windows 版本:

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

【问题讨论】:

  • 包括 Windows 7 在内,应该可以工作。 Windows 8 及更高版本,它发生了变化。请参阅this question 了解更多信息。

标签: c winapi


【解决方案1】:

这似乎是一个文档错误。调用SHAppBarMessage时,不需要在APPBARDATA结构中为ABM_GETTASKBARPOS提供窗口句柄1)

以下代码正确返回任务栏的位置(在 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

【讨论】:

  • 我想知道当任务栏在多个显示器上时如何处理。
  • @JonathanPotter:这仅检索主显示器的任务栏位置。要获取其他显示器上的任务栏位置,请改为调用 GetMonitorInfo
  • @JonathanPotter:调用GetMonitorInfo 时,您必须自己解决对接问题。它不是MONITORINFO 结构的一部分。
  • @IInspectable 目的是获取任务栏停靠设置而不是位置,即.uEdge
  • @JakeM:这也在APPBATDATA 结构中返回。一旦我在我的电脑上,我会更新这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
相关资源
最近更新 更多