找到功能区按钮的窗口句柄

时间:2011-01-04 09:37:23

标签: c++ windows ribbon

我正在尝试对Windows应用程序进行一些自动化。 为了做我想做的事,我需要一些控件的窗口句柄。

之前,我将使用EnumWindows,EnumChildWindows和GetWindowText的组合来完成此任务。但是现在,一些较新的程序不再具有带按钮的工具栏。 相反,他们有一个功能区。

这对我来说似乎不是什么问题,但现在我注意到功能区上的按钮没有显示在EnumChildWindows中! 或者至少GetWindowText不会返回与屏幕上显示的文本相同的文本。

总而言之: 谁能告诉我如何以编程方式找到功能区上按钮的句柄?

感谢。 问候, LDX

5 个答案:

答案 0 :(得分:2)

简单地说,我认为你不能。越来越多的Windows应用程序正在使用GUI框架,这些框架不会使用谨慎的子窗口呈现控件。 Ribbon UI框架似乎就是其中之一。

在不使用子窗口的应用程序中枚举控件的唯一方法是使用辅助功能API:Windows Automation API: UI Automation 是文档中的起点。

答案 1 :(得分:1)

使用Visual Studio(或任何其他类似工具)附带的Spy ++来查看这些按钮是否实际上是窗口。如果是,请使用该工具查看有关它们的详细信息。但是,这个应用程序很可能会在父窗口上下文中自行绘制它们,在这种情况下,您无法获取窗口句柄,因为它们不是真正的窗口。

答案 2 :(得分:1)

好,

所以确实无法掌握这些按钮。 我通过使用SendKeys发送激活按钮的键盘快捷方式解决了这个问题。 在我的情况下,它是保存按钮,所以我使用

  INPUT inputs[4];
  // press control
  inputs[0].type = INPUT_KEYBOARD;
  inputs[0].ki.wVk = 0x11; // "VK_Control"      
  inputs[0].ki.wScan = 0;
  inputs[0].ki.dwFlags = 0;
  inputs[0].ki.time = 0;
  inputs[0].ki.dwExtraInfo = 0;      

  // press "s"
  inputs[1].type = INPUT_KEYBOARD;
  inputs[1].ki.wVk = 0x53;  // "s"
  inputs[1].ki.wScan = 0;
  inputs[1].ki.dwFlags = 0;
  inputs[1].ki.time = 0;
  inputs[1].ki.dwExtraInfo = 0;      

  // release "s"
  inputs[2].type = INPUT_KEYBOARD;
  inputs[2].ki.wVk = 0x53;  // "s"
  inputs[2].ki.wScan = 0;
  inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
  inputs[2].ki.time = 0;
  inputs[2].ki.dwExtraInfo = 0;      

  // release control
  inputs[3].type = INPUT_KEYBOARD;
  inputs[3].ki.wVk = 0x11; // "VK_Control"      
  inputs[3].ki.wScan = 0;
  inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
  inputs[3].ki.time = 0;
  inputs[3].ki.dwExtraInfo = 0;      

  return SendInput(8, inputs, sizeof(INPUT)) == 8;

也许这可以为遇到同样问题的其他人产生想法:)

GR, LDX

答案 3 :(得分:0)

您可以拥有调用功能区的窗口的句柄。 但你无法掌握你所谓的按钮。

逻辑上:你称之为句柄?你想要HWND吗?如果你想要一个HWND,那么你需要一个窗口...但你唯一的窗口是功能区。

这称为无窗编程。

但是,您可以使用COM技术组件:COM接口IAccesible

答案 4 :(得分:-1)