【发布时间】:2016-02-09 04:18:34
【问题描述】:
我目前正在尝试获取 Windows 计算器应用程序的所有用户输入。似乎这样做的方法是使用 Win32 拦截所有用于计算器窗口的键盘和鼠标输入。我已阅读下面链接中关于子类化窗口的 MSDN 页面,并对子类化做了一些研究。
我有对窗口进行子类化的语法,但我不确定如何告诉程序我要对哪个窗口进行子类化。
我目前拥有的代码如下所示。我现在的问题是我不确定如何分配变量“hWndEdit”。我对 Win32 编程非常陌生,因此感谢您提供任何帮助。
(链接) http://msdn.microsoft.com/en-us/library/windows/desktop/ms633570(v=vs.85).aspx
WNDPROC wpOrigEditProc;
wpOrigEditProc = (WNDPROC) SetWindowLong(hWndEdit,GWL_WNDPROC,(long) WndEditProc);
LRESULT CALLBACK WndEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CHAR:
case WM_KEYUP:
case WM_KEYDOWN:
if (hWnd == hWndEdit)
return 0;
break;
case WM_DESTROY:
// Remove the subclass from the edit control.
SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG) wpOrigEditProc);
break;
default:
return CallWindowProc((WNDPROC ) wpOrigEditProc, hWnd, message, wParam, lParam);
}
return CallWindowProc((WNDPROC ) wpOrigEditProc, hWnd, message, wParam, lParam);
}
【问题讨论】:
-
让我们退后一点。您要解决的问题是什么?拦截 Calc 的输入是什么?
-
您将长期使用这个。您不仅要求对窗口过程进行子类化,而且要求在甚至不属于您的进程中进行。有很多方法可以做到这一点,但如果你刚开始使用 Win32 编程,你可能会弄湿你的脚,或者至少阅读更多内容。通过钩子和/或注入进行二级进程子类化不是为了装腔作势。
-
在您自己的进程中子类化一个窗口是一种非常标准的 winapi 技术。在另一个进程中子类化一个窗口肯定不是,它需要将一个 DLL 注入到进程中。如果您甚至无法找到您想要子类化的窗口,那么您就会迷失在什么是实用的和什么不是实用的方面。更改您没有源代码的另一个程序的行为并不是一种常见的做法。主要是因为在您无法控制的情况下对此类程序进行简单更新会破坏您的代码。
-
更不用说安全问题了。 (我刚刚做了,该死)。
-
也许您应该删除内置计算器应用程序(或限制启动它)并编写您自己的成熟计算器。它会减少工作量,然后你可以用它做任何你想做的事情。