Обнаружить щелчок левой и правой кнопкой мыши одновременно? - PullRequest
5 голосов
/ 09 июля 2010

Я переделываю Windows Minesweeper (из XP), и что-то, что они включили, состояло в том, что, если вы нажмете число с таким количеством флагов, как его число, с помощью левой и правой кнопки мыши одновременно, он покажет все остальные скрытые плитки. вокруг этого числа.

Мне трудно сказать, когда нажаты одновременно левая и правая кнопки мыши ... Я использую пару bools, по одному для каждой кнопки с событиями OnMouseDown и OnMouseUp, но если 2 кнопки нажимаются в одно и то же время (или действительно закрываются), затем отключается только одно событие MouseDown, а другое нет ... Если нажать и удерживать одну из кнопок, а затем нажать и удерживать другую, код работает хотя.

Есть ли лучший способ обнаружить этот "двойной" щелчок?

Edit:

Хорошо, небольшая история, почему я все испортил (это работало все время).

У меня есть MacBook Pro, работающий под управлением Windows 7. Для тех из вас, кто не знает, у MacBook Pro есть одна полоска для кнопки мыши, которая обычно оставляет щелчки, но если вы положите 2 пальца вниз, то щелкните правой кнопкой мыши, поэтому Вы не можете сделать и то, и другое (и нет возможности среднего щелчка). Поэтому я собирал свое приложение и отправлял его своему другу, он говорил мне, что оно не работает, поэтому я разместил этот вопрос. В конце концов я решил попробовать его на своем другом ноутбуке, Dell XPS с 2 кнопками мыши ... Как только он сработал, я передал его другим друзьям, и они подтвердили, что он работает. Я не знаю, как мой первый друг все испортил, но мораль этой истории в том, что Apple ничего не покупает. По крайней мере, это мораль, которую я получил.

Ответы [ 6 ]

8 голосов
/ 09 июля 2010

Создайте логическую переменную класса для левой и правой кнопки, по умолчанию равной false.Когда срабатывает событие нажатия кнопки мыши, установите для переменной значение true и проверьте, являются ли оба значения true.Когда загорается мышь, установите для переменной значение false.

    public bool m_right = false;
    public bool m_left = false;

    private void MainForm_MouseDown(object sender, MouseEventArgs e)
    {
        m_objGraphics.Clear(SystemColors.Control);

        if (e.Button == MouseButtons.Left)
            m_left = true;
        if (e.Button == MouseButtons.Right)
            m_right = true;

        if (m_left == false || m_right == false) return;
        //do something here
    }

    private void MainForm_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            m_left = false;
        if (e.Button == MouseButtons.Right)
            m_right = false;
     }
2 голосов
/ 09 июля 2010

Полный код:

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) leftPressed = true;
        else if (e.Button == MouseButtons.Right) rightPressed = true;


        if (leftPressed && rightPressed)
        {
            MessageBox.Show("Hello");

            // note: 
            // the following are needed if you show a modal window on mousedown, 
            // the modal window somehow "eats" the mouseup event, 
            // hence not triggering the MouseUp event below
            leftPressed = false;
            rightPressed = false;
        }


    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) leftPressed = false;
        else if (e.Button == MouseButtons.Right) rightPressed = false;
    }
0 голосов
/ 22 января 2019

Я получил следующий код для работы с моим событием Click.

if ((Control.MouseButtons == MouseButtons.Right) || (Control.MouseButtons == MouseButtons.Left))

Когда нажата только одна кнопка мыши, Control.MouseButton принимает значение MouseButtons.None "

Но когда нажаты и левая, и правая кнопки мыши, «Control.MouseButton» принимает значение либо «MouseButtons.Right», либо «MouseButtons.Left», в зависимости от того, какое нажатие было первым / последним (в зависимости от продолжительностивремя между нажатием левой и правой кнопки)

0 голосов
/ 21 сентября 2016

Другим вариантом является использование статических MouseButtons в System.Windows.Forms.Control class

Это скажет вам, какие кнопки мыши в данный момент нажаты, чтобы вы могли сделать что-то вроде следующего:

((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) &&
((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)

Вы также можете посмотреть пример MSDN

0 голосов
/ 14 ноября 2013

Вроде старый вопрос, но я столкнулся с этим (по совпадению, также делая клон Сапера) и почувствовал, что что-то упустил.Если вы хотите, чтобы щелчок выполнялся двумя кнопками, но при этом перехватывать и обычные щелчки одним нажатием, вы можете сделать следующее:

private bool left_down;
private bool right_down;
private bool both_click;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        left_down = true;
        if (right_down)
            both_click = true;
    }
    if (e.Button == MouseButtons.Right)
    {
        right_down = true;
        if (left_down)
            both_click = true;
    }
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (!right_down)
        {
            if (both_click)
                //Do both-click stuff here
            else
                //Do left-click stuff here
            both_click = false;
        }
        left_down = false;
    }
    if (e.Button == MouseButtons.Right)
    {
        if (!left_down)
        {
            if (both_click)
                //Do both-click stuff here
            else
                //Do right-click stuff here
            both_click = false;
        }
        right_down = false;
    }
}

Он перемещает обнаружение на мышь, а не на мышь.вниз.Он ничего не делает, пока вы не отпустите обе кнопки.Это работает почти так же, как версия для Minesweeper для Windows 7, за исключением того, что только правая кнопка в оригинале работает при нажатии мыши.(Честно говоря, я предпочитаю свою версию).Существует некоторая избыточность в том, что регистр обоих щелчков вызывается в двух местах в зависимости от того, отпускаете ли вы сначала левую или правую кнопку, но в любом случае это, вероятно, должен быть однострочный вызов функции.Бонус: Вы можете установить флажок both_click в другом месте, чтобы нарисовать квадрат подсказки вокруг курсора, показывающий, какие квадраты будут обнаружены при отпускании кнопок.

0 голосов
/ 09 июля 2010

Попробуйте это,

Private Sub Form_Click(... , ByVal e As ystem.Windows.Forms.MouseEventArgs)

If e.Button = MouseButtons.Right And e.Button = MouseButtons.Left Then
MsgBox ('Right & Left code')

End If
...