【问题标题】:Get text from a button in an application using win32 C++ and hooks使用 win32 C++ 和钩子从应用程序中的按钮获取文本
【发布时间】:2015-09-30 13:09:00
【问题描述】:

我正在尝试使用 Winapi 检索计算器 (calc.exe) 上的按钮文本。我已经钩住了 WH_CALLWNDPROC 并且钩子工作正常。但我无法检索任何按钮的文本(比如数字 7)。我正在使用 GetDlgItemText:

TCHAR text[256];
GetDlgItemText((HWND)0x7068c, 0x89, text, strlen(text));

这里 0x7068c 是数字 7 按钮的父窗口句柄,而 0x89 是它的控件 ID。虽然我可以通过编程方式单击它,但没有返回任何文本。

我做错了什么?我尝试将 SendMessage 与 WM_GETTEXT 一起使用,但它仍然不起作用。我想采用这种方法并从其他应用程序中的按钮、文本框中检索文本。

【问题讨论】:

  • 请给出拒绝的理由
  • 您为什么希望能够做到这一点?
  • 钩子是不必要的。但这不是重点。为什么你认为这些按钮的窗口文本是按钮的编号?真正的问题是什么?你不可能对 calc.exe 真正感兴趣。此外,每个版本的 Windows 都有不同的 calc.exe。你为什么不使用 UI 自动化?
  • @DavidHeffernan 按钮只是一个普通窗口。不应该吗?我已经在 Spy++ 中检查了它的属性
  • 钩子帮不了你。这是一个自定义类是吗?所以,我再问一次,是什么让你相信这个自定义类将按钮的显示标题保留在它的窗口文本中?我再次指出,有许多不同版本的 calc.exe。再一次,您的目标应用程序几乎肯定会以不同的方式实现。现在不会有 calc 的自定义按钮类了吧?我是在浪费时间吗?

标签: c++ winapi hook wndproc


【解决方案1】:

您可以简单地使用辅助功能:

        #include "windows.h"
        #include "Oleacc.h"
        #include "atlbase.h"
        #pragma comment(lib,"Oleacc.lib")

        int main()
        {
            CComPtr<IAccessible> pAcc;
            VARIANT varChild;
            if (SUCCEEDED(AccessibleObjectFromWindow((HWND)0x000d18e0, 
                OBJID_WINDOW,IID_IAccessible, reinterpret_cast<void**>(&pAcc))))
            {
                CComBSTR bstrName;
                varChild.vt = VT_I4;
                varChild.lVal = CHILDID_SELF;
                if (SUCCEEDED(pAcc->get_accName(varChild, &bstrName)))
                {
                    wprintf(L"%s", bstrName.m_str);
                }

            }
            return 0;
        }

【讨论】:

  • 你刚刚泄露了BSTR
  • @Ben 当然为什么不,还添加了整个代码以便于测试
  • ....aaaaand CComVARIANT... :-) 这些只是建议...我最喜欢的实际上是_com_ptr_t_bstr_t_variant_t#importFTW
  • @Ben:在提供洞察力方面,没有什么比 C 和手动资源管理更好的了。没有不可见的析构函数代码或异常路径。这是真正的所见即所得。如果您想使用它,它还可以轻松转换为任何智能指针库。如果您在答案中使用智能指针库,那么有人过来告诉您,您使用了错误的指针库。
  • @IInspectable 这不是关于深入了解资源管理的问题,也不是 C。没有人应该为此使用手动资源管理。
【解决方案2】:

我终于成功地做到了这一点,方法是使用EasyHook 挂钩 DrawTextW、DrawTextExW、ExtTextOutW API 函数来检索按钮、标签等的文本。在挂钩的函数中,我能够检索文本。这个SO thread对我帮助很大。

【讨论】:

  • 你不会碰巧在 Git 或其他地方有你的源代码吗?我正在做一个类似的练习......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多