如何检查鼠标在最后 5 秒内没有移动?
Posted
技术标签:
【中文标题】如何检查鼠标在最后 5 秒内没有移动?【英文标题】:How to check mouse is not moved from last 5 seconds? 【发布时间】:2013-12-16 12:50:22 【问题描述】:我正在为我的游戏程序处理一项任务,在该任务中,我想在离开屏幕 10 秒后隐藏鼠标。但是我可以检查鼠标移动情况...... 这是我的代码..
using namespace std;
HHOOK g_hMouseHook;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
if (nCode >= 0)
PMSLLHOOKSTRUCT pmll = (PMSLLHOOKSTRUCT) lParam;
switch (wParam)
case WM_MOUSEMOVE:
printf("Mouse has been moved\n");
break;
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
int _tmain(int argc, _TCHAR* argv[])
MSG msg;
g_hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), 0 );
if (!g_hMouseHook)
printf("err: %d\n", GetLastError());
while ( GetMessage(&msg, NULL, 0, 0) )
TranslateMessage(&msg);
DispatchMessage(&msg);
UnhookWindowsHookEx(g_hMouseHook);
return (int) msg.wParam;
我正在使用钩子来完成它,它成功地显示了鼠标移动。 现在我正在寻找一个选项,我还可以使用它来检查我的鼠标是否没有移动。 *我正在控制台上做的一件事。
我已经使用 LoadCursorfromFile 更改了鼠标光标或隐藏,它工作正常。
请分享您的意见以检查鼠标何时不移动。
【问题讨论】:
你用的是什么库? 设置一个超时回调,如果鼠标被移动则移除它并创建新的超时。 这样的事情在标准 C++ 中是不可能的。您将不得不使用第三方库,而且您似乎正在使用第三方库。哪一个?我猜是 WinAPI? 标记的 WinAPI,对熟悉它的人来说相当明显。 抱歉回复晚了,我用的是WinAPI。 【参考方案1】:致电TrackMouseEvent
设置5000 毫秒的空闲时间。您将在 5 秒后收到 WM_HOVER
消息。您可以在每次按键时重置计时器,但这有点低效。相反,在每次按键时,您都应该更新 lastKeyPressedTime
变量。现在,如果WM_HOVER
在 5 秒后到达,您检查最后一次按键是否是 5 秒前。如果是,则您既没有键盘输入也没有鼠标输入,无法移除鼠标。
如果您在鼠标空闲的最后 5 秒内有键盘输入,您应该重置 TrackMouseEvent
。如果您很懒惰,请再次将其重置为 5 秒。如果你是准确的,你必须更有创意。
【讨论】:
可以通过hook吗? 脆弱的解决方案,不能可靠地工作,当然也不能跨进程。用你的初始 5s 设置一个计时器,当它到期时调用GetLastInputInfo
,隐藏光标,如果是dwTime > 5000
,或者设置一个超时为5000 - dwTime
的新计时器。【参考方案2】:
也许GetLastInputInfo
就是你需要的MSDN here。
例如,要获取自上次鼠标移动或按键后经过的毫秒数,您可能有这样的函数:
DWORD GetIdleTime()
LASTINPUTINFO pInput;
pInput.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&pInput))
// report error, etc.
// return idle time in millisecs
return pInput.dwTime;
【讨论】:
关于何时/何地调用此函数有什么建议吗?每秒? @egur 是的,如你所愿,每秒,每半秒,随便什么。 此函数考虑所有输入事件,而不仅仅是鼠标事件。如果他只想检查鼠标输入,这个功能就不好用了。 @Paladine 是的,这是真的——正如我在回答中所说的那样“......自从最后一次鼠标移动或按键”。 @Roger,我已经使用 LASTINPUTINFO 完成了这项工作。但是我每次都必须更改光标图像,这意味着在隐藏时用空白光标替换鼠标,然后在显示时再次显示图像..你认为这是一个好的解决方案吗?以上是关于如何检查鼠标在最后 5 秒内没有移动?的主要内容,如果未能解决你的问题,请参考以下文章