【问题标题】:How to check mouse is not moved from last 5 seconds?如何检查鼠标在最后 5 秒内没有移动?
【发布时间】: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。

标签: c++ winapi visual-c++


【解决方案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 完成了这项工作。但是我每次都必须更改光标图像,这意味着在隐藏时用空白光标替换鼠标,然后在显示时再次显示图像..你认为这是一个好的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多