本文介绍了WH_MOUSE和WH_MOUSE_LL钩子之间的区别是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我发现 WH_MOUSE
并不总是被调用。问题是我使用 WH_MOUSE
而不是 WH_MOUSE_LL
?
I've found that WH_MOUSE
is not always called. Could the problem be that I'm using WH_MOUSE
and not WH_MOUSE_LL
?
代码:
class MouseHook
{
public:
static signal<void(UINT, const MOUSEHOOKSTRUCT&)> clickEvent;
static bool install()
{
if (isInstalled()) return true;
hook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)&mouseProc,
::GetModuleHandle(NULL), NULL);
return(hook != NULL);
}
static bool uninstall()
{
if (hook == NULL) return TRUE;
bool fOk = ::UnhookWindowsHookEx(hook);
hook = NULL;
return fOk != FALSE;
}
static bool isInstalled() { return hook != NULL; }
private:
static LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION &&
(wParam == WM_LBUTTONDOWN || wParam == WM_NCLBUTTONDOWN ||
wParam == WM_RBUTTONDOWN || wParam == WM_NCRBUTTONDOWN ||
wParam == WM_MBUTTONDOWN || wParam == WM_NCMBUTTONDOWN ))
{
MOUSEHOOKSTRUCT* mhs = (MOUSEHOOKSTRUCT*) lParam;
clickEvent(wParam, *mhs);
}
return ::CallNextHookEx(hook, nCode, wParam, lParam);
}
static HHOOK hook;
};
推荐答案
区别在于调用回调时的行为。
如果你使用lowlevel版本,你不会在lpfn的限制,因为调用你的钩子函数的方式执行。有关详细信息,请阅读下面。
从MSDN的SetWindowsHookEx的文档引用:
The difference is in the behavior when the callback gets called.If you're using the lowlevel version you don't incur in the limitations posed by lpfn because of the way the call to your hook function is performed. Please read below for more information.Quoting from MSDN's doc for SetWindowsHookEx:
和从LowLevelKeyboardProc:
and from LowLevelKeyboardProc:
这篇关于WH_MOUSE和WH_MOUSE_LL钩子之间的区别是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!