【问题标题】:How do I get a handle to the Start button in Windows 7?如何获得 Windows 7 中“开始”按钮的句柄?
【发布时间】:2012-03-23 02:24:30
【问题描述】:

我用:

Hwnd hStart = ::FindWindow ("Shell_TrayWnd",NULL);  // get HWND of taskbar first
hStart = ::FindWindowEx (hStart, NULL,"BUTTON", NULL); // get HWND of start button

获取开始按钮的句柄。它在 Windows XP 上正常运行, 但在 Windows 7 中,::FindWindowEx (hStart, NULL,"BUTTON", NULL) 总是返回 0,GetLastError() 也返回 0。

这是为什么呢?

【问题讨论】:

  • 我想Windows 7上的开始按钮不再有BUTTON这个类,但我可能错了。你可以用 Spy++ 检查它现在是什么,但我强烈建议你不要弄乱基本的 UI 元素,比如开始按钮。你想达到什么目的?
  • 即使你有一个开始按钮句柄,你会怎么做?
  • Gabe,我只是在研究 HOOK。 :)
  • 作为参考,Windows 8 预览版上根本没有开始按钮 :)

标签: c++ winapi windows-7


【解决方案1】:

在 Windows 7 中,类名为 "Button" 的开始按钮是桌面窗口的子窗口。您的代码假定开始按钮是名为 "Shell_TrayWnd" 的窗口的子窗口,这确实是 XP 上实现任务栏和开始菜单的方式。

对于 Windows 7,您想使用如下内容:

hStart = ::FindWindowEx(GetDesktopWindow(), NULL, "Button", NULL);

虽然我认为最好按名称搜索它以确保您获得正确的按钮。

hStart = ::FindWindowEx(GetDesktopWindow(), NULL, "Button", "Start");

我不知道 Vista 是如何实现它的任务栏和开始菜单的,但是你可以使用 Spy++ 来一探究竟。

说了这么多,如果你能找到一种方法来实现你的目标,而不需要在这些具体的实现细节上四处寻找,那就更好了。

【讨论】:

  • 别忘了,在 Windows 8 中一切都将完全不同。
  • @Mark 是的,现在是清理房屋并放弃此类黑客行为的绝佳时机
  • 谢谢!我试过hWnd = ::FindWindow("Button","Start");,它在Windows 7中工作,而在XP中它只返回NULL。我猜开始按钮确实是XP中任务栏的子窗口,而在Windows 7中它是一个独立窗口。 :)
  • 这似乎在 Windows 10 上不起作用,知道如何让它再次相关吗?
  • @YoavFeuerstein 使用 WinSpy 或 Spy++ 之类的工具。看起来它可能有标题"Start" 和类名"Start"
【解决方案2】:

::FindWindow (L"Shell_TrayWnd",NULL);

此代码用于完整的任务栏

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多