鼠标单击在c ++中多次向我发送消息

时间:2015-09-19 08:41:54

标签: c++ win32gui

这是我的代码: -

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;
}

我收到的邮件多次而不是一次

2 个答案:

答案 0 :(得分:1)

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

不会发生鼠标事件。

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 documentation mouse events了解可用的事件以及它们有哪些限制。

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

答案 1 :(得分:0)

您的线程没有供用户进行交互的GUI,因此其密钥状态永远不会更新。每个线程都有自己的密钥状态,在UI消息处理过程中会更新。

如果要在没有GUI的线程中监视鼠标,则有两种选择:

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

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