Получение положения курсора мыши при щелчке вне границы формы - PullRequest
3 голосов
/ 03 апреля 2011

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

        MessageBox.Show(Cursor.Position.ToString());

MessageBox showing mouse position.

Но мне нужно получить положение мыши, когда пользователь щелкнул вне границы формы. Не просто мышкой. Для этого я использовал следующую строку кода:

    private void Form1_Deactivate(object sender, EventArgs e)
    {
        MessageBox.Show(Cursor.Position.ToString());
    }

Я поместил MessageBox.Show (Cursor.Position.ToString ()); в формы Деактивировать событие. Когда пользователь нажимает за пределами формы, это событие обязательно происходит. Но он также отправляет неправильные значения, когда пользователь не щелкает снаружи, а изменяет программу, используя комбинацию клавиш ALT + TAB . На самом деле я должен сделать снимок экрана области, начиная с позиции первого клика. Поэтому мне нужно положение курсора, когда он нажимается за пределами формы. лайк: enter image description here

Ответы [ 5 ]

8 голосов
/ 03 апреля 2011

Для этого следует использовать логику Global Mouse Hook.

Вот хорошая статья, которая поможет вам: Обработка глобальных мышиных и клавиатурных хуков в C #

4 голосов
/ 04 октября 2011

Это может помочь кому-то. Здесь я использую Windows.Forms.Timer и два текстовых поля для отображения позиций курсора [X и Y]. На таймере отметьте вызов API GetCursorPos и получение позиции курсора.

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool GetCursorPos(ref Point lpPoint);


    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
         Point pt = new Point();
        GetCursorPos(ref pt);
        textBox1.Text = pt.X.ToString();
        textBox2.Text = pt.Y.ToString();
    }


}

С уважением, Ranjeet.

2 голосов
/ 25 июня 2013

Решение этой проблемы простое. Все, что вам нужно, это System.Windows.Forms.Timer и использовать DllImport из System.Runtime.InteropService для извлечения метода GetKeyState из user32.dll. Эта функция имеет один параметр целого типа любого типа и возвращает short (Int16). Эта функция может сказать вам, были ли нажаты какие-то клавиши или нет в любой момент и везде, независимо от формы. Когда таймер включен, вы можете проверить, находится ли позиция мыши за пределами формы. Есть много способов получить положение мыши. Одним из способов является Cursor.Position или Control.MousePosition, или вы можете использовать bool GetCursorPos (ref Point lpPoint), метод extern, который вы можете DllImport из "user32.dll". form.Bounds или form.ClientRectangle, или form.Location и form.Size или form.Left and form.Top and form.Width and form.Hight, все это приносит вам границы формы. В событии функции timer_Tick вы пишете следующий код, например: {

   Point mp = Cursor.Position;
   Rectangle fb = form.ClientRectangle; //or form.Bounds
   if (mp.X < fb.X || mp.Y < fb.Y || mp.X > fb.X + fb.Width || mp.Y > fb.Y + fb.Height)
   {
       //use GetKeyState from user32.dll to detect if at least 1 key is pressed
       //(look at internet how to do it exactly)
       //if yes MessageBox.Show("Clicked outside");
   }

} Если была нажата хотя бы 1 клавиша, а затем Показать свое сообщение с помощью MessageBox. Вы можете прочитать в Интернете, как делать все эти вещи, о которых я говорил ранее, и если вы добьетесь успеха, это сработает!

1 голос
/ 20 января 2016

для вычисления площади вместо ввода этого кода

private void Form1_Deactivate(object sender, EventArgs e)
{
    MessageBox.Show(Cursor.Position.ToString());
}

сначала создайте переменную с именем

Point pos1;

и другая переменная с именем

Point pos2;

и логическая переменная с именем

Boolean b = true;

и два двойных имени

double diffx;

и

double diffy;

и двойной для области с именем

double area;

все эти переменные будут в классе Form1 затем сделайте это в Form1_Deactivate

private void Form1_Deactivate(object sender, EventArgs e)
{
    if(b)
    {
         pos1 = Cursor.Position;
         b = false;
    }
    else
    { 
        pos2 = Cursor.Position
        if (pos1.x >= pos2.x){
            diffx = pos1.x - pos2.x;
        }
        else
        {
            diffx = pos2.x - pos1.x;
        }
        if (pos1.y >= pos2.y){
            diffy = pos1.y - pos2.y;
        }
        else
        {
            diffy = pos2.y - pos1.y;
        }
        area = diffx * diffy;
        //now display it in the message box by this:
        MessageBox.Show(area.ToString());
    }
}

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

0 голосов
/ 03 апреля 2011

Событие Deactivate уведомляет вашу форму о том, что она больше не активна.Это может произойти по многим причинам.

Обычно окно получает события мыши только тогда, когда мышь находится над этим окном. Функция SetCapture позволяет захватывать все события мыши (я не знаю .NET-аналога).Поскольку только одно окно может захватывать события мыши , вы не должны захватывать события мыши, когда в этом нет необходимости.В вопросе недостаточно подробностей о том, что вы действительно хотите сделать и почему вам нужно знать, когда пользователь нажимал за пределами вашей формы.

...