windows api 设置鼠标事件钩子

窗口监听鼠标事件钩子


可以判断鼠标在xx事件类型下,不在某个窗口范围内,可以隐藏,或者在xx范围内,可以执行某些行为
其实感觉可以不用钩子,用qt的事件循环也可以的,能不用尽量不用吧

代码示例

可以在控件的showEvent中

#ifdef Q_OS_WIN
TestCyMouseHook::hook();
#endif

可以在控件的hideEvent中

#ifdef Q_OS_WIN
TestCyMouseHook::unHook();
#endif

对应的wrapper 鼠标钩子类

#ifndef Q_OS_UNIX
class TestCyMouseHook
{
public:
	static bool hook();
	static bool unHook();

private:
	static LRESULT CALLBACK HookMouseProc(
		int code, WPARAM wparam, LPARAM lparam);

	static HHOOK s_preMouseHook;
	static int s_nHookCount;
};
#endif

cpp

#ifndef Q_OS_UNIX
HHOOK TestCyMouseHook::s_preMouseHook;

int TestCyMouseHook::s_nHookCount;

bool TestCyMouseHook::hook()
{
	if (s_nHookCount < 0)
	{
		return false;
	}

	if (s_preMouseHook == NULL && s_nHookCount == 0)
	{
		s_preMouseHook = ::SetWindowsHookEx(WH_MOUSE_LL,
			&TestCyMouseHook::HookMouseProc,
			GetModuleHandle(NULL), 0);
	}
	++s_nHookCount;
	return true;
}

bool TestCyMouseHook::unHook()
{
	if (s_nHookCount <= 0)
	{
		return false;
	}

	--s_nHookCount;
	if (s_preMouseHook != NULL && s_nHookCount == 0)
	{
		::UnhookWindowsHookEx(s_preMouseHook);
		s_preMouseHook = NULL;
	}
	return true;
}

LRESULT CALLBACK TestCyMouseHook::HookMouseProc(
	int code, WPARAM wparam, LPARAM lparam)
{
	if (TestMgr::instance())
	{
		TestMgr::instance()->onHookeMouseMsg(code, wparam, lparam);
	}
	return CallNextHookEx(s_preMouseHook, code, wparam, lparam);
}
#endif

TestMgr::onHookedMouseMsg是针对鼠标钩子事件的真正实现

void onHookeMouseMsg(int code, WPARAM wparam, LPARAM lparam);
void onHookeMouseMsg(int code, WPARAM wparam, LPARAM lparam)
{
#ifdef Q_OS_WIN
	switch (wparam)
	{
	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
	case WM_MBUTTONDOWN:
	case WM_XBUTTONDOWN:
	case WM_NCLBUTTONDOWN:
	case WM_NCRBUTTONDOWN:
	case WM_NCMBUTTONDOWN:
	case WM_NCXBUTTONDOWN:
	{
		QPoint pt = QCursor::pos();		
		if (subWidget->frameGeometry().contains(pt))
		{
			return;
		}
		
		if (!frameGeometry().contains(pt))
		{
			close();
		}
	}
	break;
	}
#endif
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值