C++ Electron 鼠标中键单击事件监听和移除函数实现
C++ Electron 鼠标中键单击事件监听和移除函数实现
本文提供了一个简单的示例代码,实现了在 Windows 下使用 C++ 监听鼠标中键单击事件的功能,并提供了添加和移除监听函数的接口:
#include <Windows.h>
#include <vector>
using namespace std;
// 鼠标消息处理函数
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0 && (wParam == WM_MBUTTONDOWN || wParam == WM_MBUTTONUP))
{
// 鼠标中键单击事件
static vector<function<void()>> middleMouseClickListeners;
if (wParam == WM_MBUTTONDOWN)
{
// 鼠标中键按下,运行所有注册的监听函数
for (auto listener : middleMouseClickListeners)
{
listener();
}
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
// 全局鼠标钩子
HHOOK g_hHook = NULL;
// 添加鼠标中键单击监听函数
void addMiddleMouseClickListener(function<void()> listener)
{
static bool isHooked = false;
if (!isHooked)
{
// 安装全局鼠标钩子
g_hHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, GetModuleHandle(NULL), 0);
isHooked = true;
}
// 将监听函数添加到列表中
static vector<function<void()>> middleMouseClickListeners;
middleMouseClickListeners.push_back(listener);
}
// 移除鼠标中键单击监听函数
void removeMiddleMouseClickListener(function<void()> listener)
{
// 从列表中移除监听函数
static vector<function<void()>> middleMouseClickListeners;
for (auto it = middleMouseClickListeners.begin(); it != middleMouseClickListeners.end(); ++it)
{
if (*it == listener)
{
middleMouseClickListeners.erase(it);
break;
}
}
static bool isHooked = false;
if (middleMouseClickListeners.empty() && isHooked)
{
// 卸载全局鼠标钩子
UnhookWindowsHookEx(g_hHook);
isHooked = false;
}
}
int main()
{
// 添加一个监听函数
addMiddleMouseClickListener([]() {
printf('Middle mouse button clicked!\n');
});
// 等待一段时间后移除该监听函数
Sleep(5000);
removeMiddleMouseClickListener([]() {
printf('Middle mouse button clicked!\n');
});
// 等待一段时间后退出程序
Sleep(5000);
return 0;
}
上述代码中,我们使用了 Windows API 中提供的鼠标钩子来监听鼠标事件。当鼠标中键单击事件发生时,我们会运行所有注册的监听函数。
我们使用了 STL 中的 vector 类来管理监听函数的列表,并提供了添加和移除监听函数的接口。在添加监听函数时,我们会安装全局鼠标钩子;在移除最后一个监听函数时,我们会卸载全局鼠标钩子,以避免不必要的资源浪费。
原文地址: https://www.cveoy.top/t/topic/ooj4 著作权归作者所有。请勿转载和采集!