WINCE6 鼠标全局钩子 响应很慢 求解答原因
本帖最后由 harkue 于 2012-09-08 16:43:22 编辑 参考http://blog.csdn.net/91program/article/details/7162896
做一个CE6 平台上的屏保程序,需要记录鼠标最后点击时间。
但是加载DLL 之后,系统响应奇慢无比!
不知道原因在哪里,求解答
代码如下
// MouseHook.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#include "MouseHook.h"
#include <windows.h>
#include <commctrl.h>
#include "pwinuser.h"
// 告诉编译器将变量放入它自己的数据共享节中
#pragma data_seg("MouseHookData")
HINSTANCE ghInst = NULL;
HHOOK ghMouseHook = NULL;
//用于记录鼠标最后点击的时间
DWORD gdwLastOperTime = 0;
#pragma data_seg()
// 告诉编译器设置共享节的访问方式为:读,写,共享
#pragma comment(linker, "/SECTION:MouseHookData,RWS")
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
ghInst = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" MOUSEHOOK_API void InstallMouseHook(void)
{
if(ghInst)
ghMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, ghInst, 0);
}
extern "C" MOUSEHOOK_API void UnMouseHook(void)
{
if(ghMouseHook)
{
UnhookWindowsHookEx(ghMouseHook);
ghMouseHook = NULL;
}
ghInst = NULL;
}
/*
nCode
[输入参数] 说明 HOOK 过程如何处理此消息。如果 nCode 小于零, HOOK 过程必须将此消息直接传递给下一个 CallNextHookEx, 并从 CallNextHookEx 返回.
本参数可以取以下的值:HC_ACTION
wParam 和 lParam 参数中包含鼠标消息的信息。
wParam
[输入参数] 鼠标消息标识. 本参数取如下值之一: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN, 或 WM_RBUTTONUP.
lParam
[输入参数] 指定 MSLLHOOKSTRUCT 结构体. 其中包含坐标等信息。
*/
// CE6 的鼠标 HOOK 的响应速度很慢, 原因不明!
extern "C" MOUSEHOOK_API LRESULT MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0) CallNextHookEx(ghMouseHook, nCode, wParam, lParam);
if(wParam == WM_LBUTTONDOWN)//鼠标按下,即记录最后点击时间
gdwLastOperTime = pMouseHookStruct->time;
return CallNextHookEx(ghMouseHook, nCode, wParam, lParam);
}
extern "C" MOUSEHOOK_API DWORD GetLastOperTime()
{
return gdwLastOperTime;
}
extern "C" MOUSEHOOK_API void SetLastOperTime(DWORD dwLastOperTime)
{
gdwLastOperTime = dwLastOperTime;
}
[解决办法]
我打印了一些日志,但是不知道哪里响应比较慢。
// x坐标 y坐标 点击时Tick值 鼠标消息
---Point x = 388 y = 197 Time = 9053261 wParam = 513
---Point x = 387 y = 205 Time = 9054118 wParam = 512
---Point x = 387 y = 205 Time = 9055127 wParam = 512
---Point x = 387 y = 205 Time = 9056136 wParam = 514
512 == WM_MOUSEMOVE
513 == WM_LBUTTONDOWN
514 == WM_LBUTTONUP
日志中发现,随便一次点击 WM_MOUSEMOVE至少有2次响应,有时候更多。
[解决办法]
代码很规矩,未发现问题,SPY++看呢?
[解决办法]
对了,还有你运行在什么设备上?是不是由于还有其他耗时的HOOK在啊?
[解决办法]
设备使用的是2440的开发板,用的WinCE6.0系统~
由于是要做一个类似屏保的功能,因此要记录鼠标点击的时间。
我现在还不清楚是不是因为有多个程序(多个界面)在运行,都要HOOK导致的?!
因为调试的时候 只启用一个程序,响应速度还是不错的。
[解决办法]
是的,HOOK对所有注册的程序有效,按注册顺序一个一个调用,并非广播。
[解决办法]
奇怪的现象出来了。。
用release版的运行,响应速度不错,用debug版的就会比较卡~