【问题标题】:Get location of the control after hooking to Drawtext function挂钩到 Drawtext 函数后获取控件的位置
【发布时间】:2013-12-10 02:46:38
【问题描述】:

我有一个正在测试的 VCL 应用程序,但没有源代码。 我需要验证在屏幕上的标签上绘制了哪些文本,但标签不是窗口,因此我创建了一个 drawtext 函数的挂钩,我可以获取绘制到屏幕上的文本。

但我无法验证当函数获取 hdc 时在屏幕上的哪个位置绘制文本,以及在上下文中绘制文本的位置。 我需要确定 hdc 在屏幕上的位置,并确保标签正确。

有办法吗? 托管非托管剂量对我来说无关紧要。

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

    您可以在 Delphi 中构建一个 DLL 并将该 DLL 注入目标进程。由于您很高兴挂钩 Win32 API,我想您不会有问题。

    在该 DLL 中,您可以找到(使用 Win32 API)HWND,它是标签的“父级”。

    使用该 HWND,您可以找到关联的 TWinControl。为此,您必须深入研究 VCL 源代码。

    对于 Delphi 4(是的,我知道,它很旧),您必须构建一个 Atom 字符串,使用 GlobalFindAtom,然后使用 GetProp。结果是指向 TWinControl 的指针。

    对于 Delphi7(也是旧的),您必须使用 RegisterWindowMessage 和一个由“ControlOfs”组成的字符串,后跟模块句柄和线程 ID。然后SendMessageLRESULT 是指向TWinControl 的指针。

    抱歉,我不知道其他 Delphi 版本,但应该都可以在 VCL 源中找到。

    一旦有了TWinControl 指针,您就可以将孩子枚举为TComponent,并获取他们的Name(因为它们出现在您没有的源代码中......),他们的@ 987654331@'s,等等,你明白了。

    【讨论】:

    • 如果一切都失败了,我会尝试这个解决方案。对于不同的delphi版本,我需要做几次。我也希望有一个涵盖其他语言的解决方案。
    • 我是针对一般情况的,别忘了 UIAutomation。但是,恕我直言,没有银弹。
    • UIAutomation 在这里无济于事,因为这是一个非窗口控件,而且 VCL 没有实现超出标准 Win32 控件免费提供的自动化接口。
    • - ".. (使用 Win32 API) HWND,它是标签的“父级”。” - 如问题所述,标签不是窗口.您建议使用什么 API 来查找其父级?
    • @SertacAkyuz 我建议 FindWindow 或 EnumWindows 等等。
    【解决方案2】:

    我认为你需要这样做:

    1. 致电WindowFromDC 查找承载标签的窗口。如您所知,Delphi 标签是非窗口化的,控件实际上是在其父窗口上绘制的。如果父级是双缓冲的,这可能会失败。在这种情况下,您没有希望从设备上下文中获取窗口句柄,因为您所拥有的只是位图的设备上下文。
    2. 现在您已经有了绘制标签的窗口,您需要找出标签在窗口上的位置。 VCL 调用SetWindowOrgEx 来安排设备上下文在标签左上角的逻辑坐标为 0,0。因此,您可以调用GetWindowOrgEx 来查找标签相对于父标签的位置。
    3. 现在您知道了标签相对于父级的位置以及父级的窗口句柄,您可以使用ClientToScreen 确定文本在屏幕上的绘制位置。

    由于设备上下文仅在拥有它们的进程中才有意义,因此您需要注入目标进程来调用它。

    【讨论】:

    • 还有希望。您只需要确定位图缓冲区最终如何绘制到屏幕上。您可以验证文本是否写入位图中的正确位置,因此如果您可以验证位图是否绘制到屏幕上的正确位置,那么您就完成了。另一种方法可能是将最终的屏幕图像与已知良好的图像进行比较。
    • 您知道如何验证位图的绘制位置吗?
    • 我也可以从进程外部更改双缓冲吗?
    • 我做的事情与大卫所说的类似,但也必须挂钩各种“DC”和位图 API。如果你问的话,一团糟。
    • 我创建了一个没有双倍缓冲的 delphi 演示应用程序,但在使用 WindowFromDC 时我仍然得到 0。 IntPtr objHWND = WindowFromDC(hDC);
    猜你喜欢
    • 2021-03-13
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多