如何检查鼠标在最后 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 秒内没有移动?的主要内容,如果未能解决你的问题,请参考以下文章

web前端鼠标放在div标签制成的盒子上如何实现图片一秒内由正方形变为圆形在变?

matlab没有鼠标怎么操作

Firebug:如何检查随鼠标移动而变化的元素?

使用 jQuery 检查没有滚动条的鼠标滚轮事件

如何检查鼠标光标是不是在 Javafx 中的按钮上?

如何在没有事件的情况下获取鼠标位置(不移动鼠标)?