【发布时间】:2013-01-05 07:34:36
【问题描述】:
我是 C++ 编程的新手,正在尝试制作一个小型报告工具,可以检测鼠标和键盘何时没有被触摸过一段时间。
我一直在寻找一些示例鼠标钩子代码并找到了这个
#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )
#include <windows.h>
#include <stdio.h>
HHOOK hMouseHook;
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
printf("Mouse position X = %d Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
return CallNextHookEx(hMouseHook,
nCode,wParam,lParam);
}
void MessageLoop()
{
MSG message;
while (GetMessage(&message,NULL,0,0)) {
TranslateMessage( &message );
DispatchMessage( &message );
}
}
DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm);
if (!hInstance) return 1;
hMouseHook = SetWindowsHookEx (
WH_MOUSE_LL,
(HOOKPROC) KeyboardEvent,
hInstance,
NULL
);
MessageLoop();
UnhookWindowsHookEx(hMouseHook);
return 0;
}
int main(int argc, char** argv)
{
HANDLE hThread;
DWORD dwThread;
hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
if (hThread)
return WaitForSingleObject(hThread,INFINITE);
else return 1;
}
我编译并运行了它作为一个测试,它似乎做了我想要的。在那之后,我开始测试一些东西。在 c++ 和 g++ 上编译它的地狱。删除了 pMouseStruct 并改为测试“if(lParam)”。一切似乎都正常,而且时间已经很晚了,所以我决定第二天再来。
当我今天启动到 Windows 时,我无法移动鼠标或使用键盘输入任何内容。 Windows 内的输入(正常和安全模式)似乎不再起作用。任何想法如何解决这个问题?
使用 Windows 7 64 位。
到目前为止,我已经尝试了以下方法:
- 扭转了最近的超频调整。
- 将代码恢复到我使用它、重新编译并运行之前的状态。
- 谷歌搜索。
- chkdsk /f 在系统驱动器上。
- 系统还原(不喜欢突袭)
- 从朋友那里复制了 user32.dll。
请原谅我的无知:-)
【问题讨论】:
-
顺便说一句,使用this 可能更容易做到。不过,这取决于你。两种方式各有优势。
-
谢谢克里斯。这看起来是一个更合适的选择。我修好窗户后会调查它。
-
如果您没有编写脚本或将其配置为在系统启动时启动,那么您可能与当前代码无关。恢复它造成的损坏比代码是什么更重要。
-
您不能从其他机器复制。但是您在同一台机器上使用另一个驱动器制作了操作系统安装的新副本。然后从新文件中复制文件。 DVD 不会包含 HAL.DLL,它们可能有不同的名称,例如 HALACPI.DL_,并且是以压缩的方式。