Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用WM_输入检测连续的鼠标点击?_C++_C_Windows_Opengl_Raw Input - Fatal编程技术网

C++ 如何使用WM_输入检测连续的鼠标点击?

C++ 如何使用WM_输入检测连续的鼠标点击?,c++,c,windows,opengl,raw-input,C++,C,Windows,Opengl,Raw Input,我正在使用WM_输入检测我的鼠标更新,当我单击我的鼠标按钮1时,我将检测到按钮1已关闭。但是,如果我按住按钮,鼠标的后续更新将显示按钮1未按下 显示usButtonFlags可以检测鼠标按钮的转换状态。这意味着rawinput可以在按下和释放鼠标时检测鼠标,但无法检测鼠标按钮的按下或释放状态 但是,rawinput是否可以检测鼠标按钮的按下或释放状态,而不是转换状态 我使用OSG来渲染全屏场景,因此,所有鼠标点击都应该与当前窗口相关联。我使用osgViewer::Viewer的eventTrav

我正在使用WM_输入检测我的鼠标更新,当我单击我的鼠标按钮1时,我将检测到按钮1已关闭。但是,如果我按住按钮,鼠标的后续更新将显示按钮1未按下

显示usButtonFlags可以检测鼠标按钮的转换状态。这意味着rawinput可以在按下和释放鼠标时检测鼠标,但无法检测鼠标按钮的按下或释放状态

但是,rawinput是否可以检测鼠标按钮的按下或释放状态,而不是转换状态

我使用OSG来渲染全屏场景,因此,所有鼠标点击都应该与当前窗口相关联。我使用osgViewer::Viewer的eventTraversal函数来更新原始输入数据:

class CustomViewer : public osgViewer::Viewer
{
public:
    CustomViewer() : osgViewer::Viewer() {}
    virtual ~CustomViewer() {}

    virtual void eventTraversal()
    {
        RawInputEventRegistry::instance()->updateState( _eventQueue.get() );
        osgViewer::Viewer::eventTraversal();

    }
}

void RawInputEventRegistry::updateState( osgGA::EventQueue* eventQueue )
{
    MSG msg;
    if( GetMessage( &msg, c_handle, WM_INPUT, WM_INPUT ) != -1)
    { 
        HRAWINPUT test = (HRAWINPUT)msg.lParam;
               add_to_raw_mouse_x_and_y((HRAWINPUT)msg.lParam);

    } 

    osg::ref_ptr<RawInputEvent> event = new RawInputEvent;
    event->SetMouseData(raw_mice);
    eventQueue->userEvent( event.get() );
}

是什么阻止您跟踪鼠标按钮的状态?这并不是说,在你的过程没有得到通知的情况下,这些变化是不稳定的。DirectInput也可以满足您的要求。当我的点击和发布速度相对较慢时,就不会有问题了。但当我在窗口上移动鼠标并快速释放按钮时,系统无法跟踪状态变化。我认为问题是:当我快速移动时,观看者需要更新图像,当在帧更新期间释放按钮时,系统就没有机会检测到释放信号。如果发生这种情况,你就做错了。基于事件的输入系统的核心原则之一是,要么不必丢失任何事件,要么在丢失事件的情况下,应用程序会被告知这一点。Windows是并没有事件丢失的类型。如果您粘贴一些源代码,这会有所帮助。即您的事件检索和调度代码。如果鼠标按钮在指针位于窗口外的情况下释放,则可能发生的情况是。然而,在这种情况下,您的程序中有一个设计错误,因为如果您依赖于跟踪鼠标状态,您应该抓住指针。我想按钮应该在窗户里面
if (raw->data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) raw_mice[i].buttonpressed[0] = 1;