【问题标题】:Find window handle of a ribbon button查找功能区按钮的窗口句柄
【发布时间】:2011-01-10 21:20:45
【问题描述】:

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

以前,我会使用 EnumWindows、EnumChildWindows 和 GetWindowText 的组合来完成此操作。但是现在,一些较新的程序不再有带有按钮的工具栏。 相反,他们有一条丝带。

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

长话短说: 谁能告诉我如何以编程方式找到功能区上按钮的句柄?

谢谢。 问候, ldx

【问题讨论】:

    标签: c++ windows ribbon


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        好的,

        因此,确实不可能掌握这些按钮。 我通过使用 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;
        

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

        格, ldx

        【讨论】:

          【解决方案4】:

          您可以拥有称为功能区的窗口句柄。 但是您无法处理所谓的按钮。

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

          这称为无窗口编程。

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

          【讨论】:

            【解决方案5】:
            猜你喜欢
            • 2010-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多