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 类来管理监听函数的列表,并提供了添加和移除监听函数的接口。在添加监听函数时,我们会安装全局鼠标钩子;在移除最后一个监听函数时,我们会卸载全局鼠标钩子,以避免不必要的资源浪费。

C++ Electron 鼠标中键单击事件监听和移除函数实现

原文地址: https://www.cveoy.top/t/topic/ooj4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录