积极答复者
C++如何使用钩子来获取AfxWnd42中的文字信息

问题
答案
-
你好,
你已经能通过WM_PAINT消息机制获取窗口的部分信息,但是获取不到绘制信息,是由于使用WM_PAINT消息获取绘制信息时未能得到有效相应。
因为无法确切了解到你所编程序用到的方法,也不知你具体的调用步骤,所以只能在这里提供更多相关WM_PAINT消息的内容:
WM_PAINT消息是由系统产生,不应通过程序发送。为了使窗口在特定设备环境中绘制消息,要使用WM_PRINT或者WM_PRINTCLIENT消息。注意:这需要目标窗口支持WM_PRINTCLIENT消息,而大多数常用控件都是支持WM_PRINTCLIENT消息的。
系统只发送一次内部WM_PAINT 消息。在WM_PAINT 消息从GetMessage或 PeekMessage返回,或者由 UpdateWindow被送往窗口后,系统不再发送其它WM_PAINT 消息直到窗口无效或是设置RDW_INTERNALPAINT标志的 RedrawWindow被再次调用。
可以考虑使用一些窗口函数如EnumChildWindows函数帮助实现你所设计的程序的功能:
BOOL WINAPI EnumChildWindows( _In_opt_ HWND hWndParent, _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam );
具体请参看:
WM_PAINT 消息
EnumChildWindows函数另外,有关于使用Hook函数处理窗口消息的文章和代码,设计方法便是“植入代码”,请点击:
希望对你的问题有所帮助。
感谢你的支持。
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.- 已标记为答案 Jane Wang - MSFTModerator 2013年8月6日 10:18
全部回复
-
你好,
你可以尝试在编写的程序中使用钩子函数(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.
相关链接:
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.- 已编辑 Jane Wang - MSFTModerator 2013年8月2日 7:24 edit
-
你好,
你已经能通过WM_PAINT消息机制获取窗口的部分信息,但是获取不到绘制信息,是由于使用WM_PAINT消息获取绘制信息时未能得到有效相应。
因为无法确切了解到你所编程序用到的方法,也不知你具体的调用步骤,所以只能在这里提供更多相关WM_PAINT消息的内容:
WM_PAINT消息是由系统产生,不应通过程序发送。为了使窗口在特定设备环境中绘制消息,要使用WM_PRINT或者WM_PRINTCLIENT消息。注意:这需要目标窗口支持WM_PRINTCLIENT消息,而大多数常用控件都是支持WM_PRINTCLIENT消息的。
系统只发送一次内部WM_PAINT 消息。在WM_PAINT 消息从GetMessage或 PeekMessage返回,或者由 UpdateWindow被送往窗口后,系统不再发送其它WM_PAINT 消息直到窗口无效或是设置RDW_INTERNALPAINT标志的 RedrawWindow被再次调用。
可以考虑使用一些窗口函数如EnumChildWindows函数帮助实现你所设计的程序的功能:
BOOL WINAPI EnumChildWindows( _In_opt_ HWND hWndParent, _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam );
具体请参看:
WM_PAINT 消息
EnumChildWindows函数另外,有关于使用Hook函数处理窗口消息的文章和代码,设计方法便是“植入代码”,请点击:
希望对你的问题有所帮助。
感谢你的支持。
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.- 已标记为答案 Jane Wang - MSFTModerator 2013年8月6日 10:18
-
你好,
请问你的问题是否已经得到解决?如果仍没有解决,请列出此问题相关的详细信息,以寻求答案。
如果这里已经有解决方案,请将其标记为答复。
因为你已经长时间没有回复,两天之后我们将关闭此贴,如有问题请考虑在相关论坛上张贴新帖。
感谢你的支持。
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.