none
C++如何使用钩子来获取AfxWnd42中的文字信息 RRS feed

  • 问题

  •     如何利用钩子来获取AfxWnd42中的文字信息,我想读取一个手写软件备选字中的那些文字信息。
        就像有个工具叫做TextCatch那样,它可以读取到AfxWnd42的文字信息
    2013年7月28日 6:54

答案

  • 你好,

    你已经能通过WM_PAINT消息机制获取窗口的部分信息,但是获取不到绘制信息,是由于使用WM_PAINT消息获取绘制信息时未能得到有效相应。

    因为无法确切了解到你所编程序用到的方法,也不知你具体的调用步骤,所以只能在这里提供更多相关WM_PAINT消息的内容:

    WM_PAINT消息是由系统产生,不应通过程序发送。为了使窗口在特定设备环境中绘制消息,要使用WM_PRINT或者WM_PRINTCLIENT消息。注意:这需要目标窗口支持WM_PRINTCLIENT消息,而大多数常用控件都是支持WM_PRINTCLIENT消息的。

    系统只发送一次内部WM_PAINT 消息。在WM_PAINT 消息从GetMessagePeekMessage返回,或者由 UpdateWindow被送往窗口后,系统不再发送其它WM_PAINT 消息直到窗口无效或是设置RDW_INTERNALPAINT标志的 RedrawWindow被再次调用。

    可以考虑使用一些窗口函数如EnumChildWindows函数帮助实现你所设计的程序的功能:

    BOOL WINAPI EnumChildWindows(
      _In_opt_  HWND hWndParent,
      _In_      WNDENUMPROC lpEnumFunc,
      _In_      LPARAM lParam
    );

    具体请参看:

    WM_PAINT 消息
    EnumChildWindows函数

    Window函数

    另外,有关于使用Hook函数处理窗口消息的文章和代码,设计方法便是“植入代码”,请点击:

    API Monitoring Unleashed

    希望对你的问题有所帮助。

    感谢你的支持。


    Jane Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月2日 13:06
    版主

全部回复

  • 你好,

    你可以尝试在编写的程序中使用钩子函数(Hook Function)和WinAPI函数获取当前窗口的信息。

    首先,GetActiveWindow函数——获取当前活动窗口的句柄

    HWND WINAPI GetActiveWindow(void);

    其次,SetWindowsHookEx函数——设置钩子

    HHOOK WINAPI SetWindowsHookEx(
      _In_  int idHook,
      _In_  HOOKPROC lpfn,
      _In_  HINSTANCE hMod,
      _In_  DWORD dwThreadId
    );

    同时,可以运用释放钩子函数(UnhookWindowsHookEx function)和继续钩子函数(CallNextHookEx function)。

    可以参看cnblogs上关于使用键盘钩子的代码:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      end;
    
    {声明键盘钩子回调函数; 其参数传递方式要用 API 的 stdcall}
    function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.DFM}
    
    var
      hook: HHOOK; {定义一个钩子句柄}
    
    {实现键盘钩子回调函数}
    function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
    begin
      if (wParam = 65) then Beep; {每拦截到字母 A 会发声}
      Result := CallNextHookEx(hook, nCode, wParam, lParam);
    end;
    
    {设置键盘钩子}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      hook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, 0, GetCurrentThreadID);
    end;
    
    {释放键盘钩子}
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnhookWindowsHookEx(hook);
    end;
    
    end.

    相关链接:

    Hook Functions

    使用钩子函数


    Jane Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2013年7月30日 2:12
    版主
  •       谢谢您的回复,之前我尝试过用了钩子来实现获取WM_PAINT绘制的文字信息,可是只能获取到一些基本的信息,如:窗口对应类信息以及样式信息等,没办法获取到绘制的那些信息。如下图所示:例如在手写软件---文通慧视小灵鼠的备选字窗口,我想通过自己的程序实现读取备选字框中的文字信息,用什么办法?期待您的回复!!

    权限不够,图片无法上传,抱歉。。。

    用spy++获取的到信息为:

    文本:WordPageWnd

    类:AfxWnd42

    2013年8月2日 7:15

  •   谢谢您的回复,之前我尝试过用了钩子来实现获取WM_PAINT绘制的文字信息,可是只能获取到一些基本的信息,如:窗口对应类信息以及样式信息等,没办法获取到绘制的那些信息。如下图所示:例如在手写软件---文通慧视小灵鼠的备选字窗口,我想通过自己的程序实现读取备选字框中的文字信息,用什么办法?期待您的回复!!

    权限不够,图片无法上传,抱歉。。。

    用spy++获取的到信息为:

    文本:WordPageWnd

    类:AfxWnd42


    2013年8月2日 7:16
  • 你好,

    你已经能通过WM_PAINT消息机制获取窗口的部分信息,但是获取不到绘制信息,是由于使用WM_PAINT消息获取绘制信息时未能得到有效相应。

    因为无法确切了解到你所编程序用到的方法,也不知你具体的调用步骤,所以只能在这里提供更多相关WM_PAINT消息的内容:

    WM_PAINT消息是由系统产生,不应通过程序发送。为了使窗口在特定设备环境中绘制消息,要使用WM_PRINT或者WM_PRINTCLIENT消息。注意:这需要目标窗口支持WM_PRINTCLIENT消息,而大多数常用控件都是支持WM_PRINTCLIENT消息的。

    系统只发送一次内部WM_PAINT 消息。在WM_PAINT 消息从GetMessagePeekMessage返回,或者由 UpdateWindow被送往窗口后,系统不再发送其它WM_PAINT 消息直到窗口无效或是设置RDW_INTERNALPAINT标志的 RedrawWindow被再次调用。

    可以考虑使用一些窗口函数如EnumChildWindows函数帮助实现你所设计的程序的功能:

    BOOL WINAPI EnumChildWindows(
      _In_opt_  HWND hWndParent,
      _In_      WNDENUMPROC lpEnumFunc,
      _In_      LPARAM lParam
    );

    具体请参看:

    WM_PAINT 消息
    EnumChildWindows函数

    Window函数

    另外,有关于使用Hook函数处理窗口消息的文章和代码,设计方法便是“植入代码”,请点击:

    API Monitoring Unleashed

    希望对你的问题有所帮助。

    感谢你的支持。


    Jane Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月2日 13:06
    版主
  • 你好,

        请问你的问题是否已经得到解决?如果仍没有解决,请列出此问题相关的详细信息,以寻求答案。

        如果这里已经有解决方案,请将其标记为答复。

        因为你已经长时间没有回复,两天之后我们将关闭此贴,如有问题请考虑在相关论坛上张贴新帖。

        感谢你的支持。


    Jane Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月5日 1:29
    版主