Как предотвратить прерывание работы MouseMove другими кнопками мыши? - PullRequest
0 голосов
/ 27 августа 2011

Если вы поместите панель в новый проект C # и захватите ее событие MouseMove, например:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Left)
        return;

    Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}

Он сообщает клиентские координаты мыши, пока левая кнопка мыши удерживается нажатой, даже если курсор выходит за пределы панели.

Однако, если вы удерживаете левую кнопку мыши в контейнере, а затем, удерживая нажатой левую кнопку мыши, нажимаете любую другую кнопку мыши, она больше не вызывает MouseMove, находясь за пределами контейнера. *

Есть ли способ изменить это? Спасибо за чтение.

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

1: Если вы пытаетесь заставить его работать только , когда левая кнопка нажата, попробуйте следующее:

bool mouseDown = false;

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (!mouseDown)
        return;

    Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        mouseDown = true;
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        mouseDown = false;
}

2: В противном случае, если вы хотите, чтобы он работал, когда любая кнопка мыши нажата, попробуйте следующее:

int mouseDown = 0;

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (mouseDown == 0)
        return;

    Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
    mouseDown++;
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
    mouseDown--;
}
0 голосов
/ 27 августа 2011

В дополнение к решению Джастина скажут, что:

Я думаю, это потому, что если во время перетаскивания вы выходите из панели, щелкните правой кнопкой мыши out на панели, заставляет панель терять фокус, поэтому элемент управления больше не становится активным.

В случае, если вы перетаскиваете мышь внутри панели и щелкаете правой кнопкой мыши внутри панели, происходит что-то вроде этого.

Я только что захватил с помощью Spy ++ Windows Explorer и провел тест, поэтому переместил мышь с помощью LButton вниз и в какой-то момент, не отпуская ее, щелкнул правой кнопкой мыши. И вот результат:

Стрелками я подписываю строку, в которой щелкнул правой кнопкой, где WM_CAPTURECHANGED сообщение отправлено. Это сообщение согласно документации:

Отправляется в окно, которое теряет захват мыши.

Посмотрите на следующую строку со стрелкой. Дескриптор следующего окна равен 0, поэтому окна нет. Так что это означает, как простая команда: вы потеряли захват мыши.

Надеюсь, это поможет.

Screenshot of local test

...