子类另一个应用程序的控件?

时间:2010-06-27 23:55:38

标签: c++ c winapi

是否有可能继承另一个应用程序的控件,以便我的应用程序可以在其他应用程序执行代码并接收lParam和wParam之前执行某些操作?例如:继承记事本的编辑控件,当用户输入时,能够知道用户键入了什么?如果我提供记事本的编辑控件的hWnd,SetWindowSubclass会工作吗?我会收到所有消息的lParam和wParam吗?

由于

2 个答案:

答案 0 :(得分:0)

不,这不是那么简单。 MSDN page for SetWindowSubclass上的警告明确说明:

  

警告您不能使用子类化辅助函数来跨线程子窗口

This article outlines the process用于将代码注入另一个进程,但总而言之,您基本上需要:

  1. 使用CreateRemoteThreadLoadLibrary
  2. 相应地设置AppInit_DLLs注册表项
  3. 在远程进程中运行代码后,您可以使用SetWindowLongPtr对窗口进行子类化,然后使用常规IPC技术(命名管道等)与您的进行通信过程(如果需要)。

答案 1 :(得分:0)

是的,如果您的代码在应用程序的进程中运行,那很容易实现。你可以用DLL做到这一点。您只需使用GetWindowLongPtr和GWLP_WNDPROC来获取应用程序的窗口函数,然后使用SetWindowLongPtr设置自己的窗口函数。在窗口函数中,检查要更改的消息,并使用更改的值调用应用程序的窗口函数。如果有任何其他消息,您必须直接调用它。使用CallWindowProc来调用窗口函数,因为默认的windows函数不是指针。

另一种方法是使用CallWndProc钩子函数。使用WH_CALLWNDPROC调用SetWindowsHookEx以安装它。尽管如此,还没有尝试过这个,但你不需要进入这个过程的空间,IIRC。