鼠标点击发送消息多次在c++中

Mouse click sending me message multiple times in c++

本文关键字:c++ 消息 鼠标      更新时间:2023-10-16

这是我的代码:-

DWORD WINAPI ThreadMouse(void* data){
    while (1){
        //Check the mouse left button is pressed or not
        if ((GetKeyState(VK_LBUTTON) & 0x8000) != 0)
        {
            MessageBox(NULL, L"Left Clicked", L"", NULL);
            break;
        }
        //Check the mouse right button is pressed or not
        if ((GetKeyState(VK_RBUTTON) & 0x100) != 0)
        {
            MessageBox(NULL, L"Right Clicked", L"", NULL);
            break;
        }
    }
    return 0;
}

我多次收到消息而不是一次

这看起来像一个线程,它轮询鼠标的状态。

不是获取鼠标事件的东西。

Windows可以接收事件

我有一个项目:-

class CImageDisplay :
public wxScrolledWindow,
public IToolTarget
{
   /// omitted
     void OnMouseDClick( wxMouseEvent& mouseEvent );
     void OnMouseUp( wxMouseEvent& mouseEvent );
};

其中wxScrolledWindow来源于wxWindow。为鼠标事件声明函数。

在cpp文件中,我有…

BEGIN_EVENT_TABLE(CImageDisplay, wxScrolledWindow)
    EVT_MOTION(CImageDisplay::OnMouseMove )
    EVT_LEFT_DOWN(CImageDisplay::OnMouseDown )
    EVT_LEFT_DCLICK(CImageDisplay::OnMouseDClick )
    EVT_LEFT_UP(CImageDisplay::OnMouseUp )
   // omitted
END_EVENT_TABLE()

这告诉wx在事件(EVT_*发生)时调用我的函数。然后我可以在鼠标事件发生时跟踪它们,但除此之外,我的代码不做任何事情。

查看wx文档(例如wx文档鼠标事件),了解哪些事件可用,以及它们有哪些限制。

查看示例-例如plot.cpp使用鼠标事件。

你的线程没有一个用户交互的GUI,所以它的键状态永远不会更新。每个线程都有自己的键状态,在UI消息处理期间更新。

如果您想在没有GUI的线程中监视鼠标,您有两个选择:

  1. 使用SetWindowsHookEx()WH_MOUSEWH_MOUSE_LL钩子钩住鼠标。线程需要一个消息循环来服务钩子。

  2. 让你的线程创建一个隐藏的窗口(和消息循环),然后使用RegisterRawInputDevices()让鼠标发送WM_INPUT消息到你的窗口