0

我在 C++ 中针对 UWP 的 Windows WRL 进行编码,我需要处理鼠标输入,有时包括同时按下的左/右按钮。

我的代码只接收第一个鼠标按钮按下和最后一个鼠标按钮释放的事件。因此,如果我按下右按钮,然后按下左按钮,则不会为左按钮触发 PointerPressed。同样,如果我释放右键然后释放左键,则不会为右键触发 PointerReleased。我订阅的事件如下:

void App::SetWindow(CoreWindow^ window)
{
  window->PointerPressed += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &App::OnPointerPressed);
  window->PointerReleased += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &App::OnPointerReleased);
}

void App::OnPointerPressed(CoreWindow ^sender, PointerEventArgs ^args)
{
}

void App::OnPointerReleased(CoreWindow ^sender, PointerEventArgs ^args)
{
}

请让我知道我的代码是否需要在按钮按下/释放之间重置某些内容,或者我是否应该订阅其他一些事件。

谢谢

4

1 回答 1

0

CoreWindow.PointerPressed事件在交互会话中检测到的第一个鼠标按钮按下时触发,而在交互会话结束之前第二次鼠标按钮按下时不会触发该事件。类似地,CoreWindow.PointerReleased事件仅在最后一个鼠标按钮被释放时触发,也就是说,当您的第一个按钮被释放并且第二个按钮未被释放时不会触发该事件。

因此,您不能使用CoreWindow.PointerPressedCoreWindow.PointerReleased事件来检测同时按下的左右按钮。

您可以使用CoreWindow.PointerMoved事件来检测您同时进行的两个鼠标操作。

例如,

Void App::SetWindow(CoreWindow^ window)
{
    window->PointerMoved+=ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &App::OnPointerMoved);
}

Void App::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args)
{
    if (args->CurrentPoint->Properties->IsLeftButtonPressed)
    {
        pressed++;  // pressed is an int variable whose initial value is 0,  pressed is defind in App.xaml.h
    }
    if (args->CurrentPoint->Properties->IsRightButtonPressed)
    {
        released++;  // released is an int variable whose initial value is 0,  released is defind in App.xaml.h
    }
    if (pressed&&released)
    {
        pressed = 0;
        released = 0;
       //Here we know the right and left button of mouse is pressed
    }
}
于 2020-11-06T05:54:39.677 回答