在我看来,子类化是您正在寻找的。
当创建 Windows 应用程序时,它会生成一个窗口,然后将子窗口添加到该窗口(子窗口称为控件,其行为与 Windows 完全相同!它们可以是按钮、文本区域等...)。
每个窗口都有一个 Window 过程,每次用户/程序与您的窗口交互时,您的窗口过程都会收到一条包含交互信息的消息。很多时候,控件将与其父级共享一个窗口过程,并且在该窗口过程中,代码根据消息所描述的窗口/控件的 ID (hwnd) 确定要执行的操作 - 也就是说:“关闭如果“单击”消息描述了退出按钮控件,则程序。如果“单击”消息描述父窗口,则不执行任何操作。”。
要了解有关 Windows 的更多信息,请查看此处:http: //msdn.microsoft.com/en-us/library/aa383738%28v=vs.85%29.aspx
子类化是拦截和/或捕获发往另一个 Window 过程的消息的过程。它通常用作扩展第三方应用程序的控件和窗口行为的一种方式。可以使用DLL、GetWindowLong()
、SetWindowLong()
、CallWindowProcedure()
和您自己的自定义窗口过程对另一个进程进行子类化。这很容易——这就是你要做的事情:
- 找到您希望使用子类化的目标窗口
FindWindow()
- 获取上一个窗口过程并存储它。
WNDPROC wpOrigEditProc = GetWindowLong(hTargetWnd, GWL_WNDPROC)
SetWindowLong(hTargetWnd, GWL_WNDPROC, HookWndProcedure);
然后,当您卸载时,再次恢复旧的窗口程序。Window 过程是你所有魔法发生的地方。您将能够在该函数内部决定您希望处理哪些消息以及希望将哪些消息传递给旧窗口过程。这是一个示例窗口过程:
LRESULT APIENTRY HookWndProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if(hwnd == hTargetWndButton_OK) {
// This is the button we wish to intercept... do some processing, then send it back to Windows
return DefWindowProc(hwnd, uMsg, wParam, lParam);
} else {
// Allow the message to pass through to the original application's window procedure.
return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
wParam, lParam);
}
}
`
然后,诀窍是将您的 DLL 加载到目标进程中。我相信最好的方法是在应用程序中添加一个指向您的 DLL 的导入条目,因为无论如何应用程序和您的 DLL 都应该捆绑在一起。要添加导入,请使用 CFF Explorer!
我相信您会有更多问题,因为可能缺少一些信息。我将尝试回答我的帖子中出现的更多问题,但如果我没有立即回复,请阅读上面的 MSDN 链接 :D。希望这对您来说是一次很棒的学习经历:)