Получение положения мыши в С#

Как получить положение мыши? Я хочу это с точки зрения положения экрана.

Я запускаю свою программу, которую хочу установить в текущую позицию мыши.

Location.X = ??
Location.Y = ??

Редактировать. Это должно произойти до создания формы.


person Athiwat Chunlakhan    schedule 22.08.2009    source источник


Ответы (9)


Вы должны использовать System.Windows.Forms.Cursor. Позиция: "Точка, представляющая позицию курсора в экранных координатах".

person RichieHindle    schedule 22.08.2009
comment
Cursor.Position отображает мою всплывающую подсказку за пределами экрана :(- - person Thomas Eyde; 20.10.2011
comment
@Thomas Eyde: я предполагаю, но может ли это быть потому, что положение мыши находится в координатах экрана, а положение вашей всплывающей подсказки относительно его родительского окна? Возможно, вам придется использовать PointToClient. - person RichieHindle; 20.10.2011
comment
Да, это то, что я должен был сделать. - person Thomas Eyde; 23.10.2011

Если вы не хотите ссылаться на формы, вы можете использовать взаимодействие, чтобы получить позицию курсора:

using System.Runtime.InteropServices;
using System.Windows; // Or use whatever point class you like for the implicit cast operator

/// <summary>
/// Struct representing a point.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }
}

/// <summary>
/// Retrieves the cursor's position, in screen coordinates.
/// </summary>
/// <see>See MSDN documentation for further information.</see>
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

public static Point GetCursorPosition()
{
    POINT lpPoint;
    GetCursorPos(out lpPoint);
    // NOTE: If you need error handling
    // bool success = GetCursorPos(out lpPoint);
    // if (!success)
        
    return lpPoint;
}
person Mo0gles    schedule 07.04.2011
comment
Как указать тип POINT? - person Manish Dubey; 19.07.2016
comment
Добавить ссылку на System.Drawing - person Bose_geek; 04.06.2017
comment
отличное решение. Но вам не нужно объявлять структуру POINT. Просто используйте пространство имен Win32Interop.Structs. - person Manpreet Singh Dhillon; 05.04.2020
comment
@ManpreetSinghDhillon Доступен ли Win32Interop.Structs в .Net Core? Если да, то под какой ссылкой на пакет/систему nuget? - person demonicdaron; 01.06.2020
comment
@ManpreetSinghDhillon Использование собственной структуры позволяет вам неявно привести ее к любой точке, которую вы используете в своем коде, это немного более плавно. Если вам достаточно Win32Interop.Structs, обязательно используйте его! - person Mo0gles; 08.06.2020
comment
@Bose_geek извините, если это неясно, но если вы хотите использовать другую структуру Point, вы просто меняете эту часть кода и ссылаетесь на любую структуру/класс Point, которую хотите. - person Mo0gles; 08.06.2020

Cursor.Position получит текущую положение мыши на экране (если вы находитесь в Control свойство MousePosition также получит такое же значение).

Чтобы установить положение мыши, вам нужно будет использовать Cursor.Position и присвоить ему новый Точка:

Cursor.Position = new Point(x, y);

Вы можете сделать это в своем методе Main перед созданием формы.

person adrianbanks    schedule 22.08.2009

Чтобы ответить на ваш конкретный пример:

// your example
Location.X = Cursor.Position.X;
Location.Y = Cursor.Position.Y;

// sample code
Console.WriteLine("x: " + Cursor.Position.X + " y: " + Cursor.Position.Y);

Не забудьте добавить using System.Windows.Forms; и добавить ссылку на него (щелкните правой кнопкой мыши ссылки > добавить ссылку > вкладка .NET > Systems.Windows.Forms > ok)

person Benjamin Crouzier    schedule 15.10.2012

System.Windows.Forms.Control.MousePosition

Получает положение курсора мыши в экранных координатах. "Свойство Position идентично свойству Control.MousePosition".

person James    schedule 05.03.2013
comment
Не нужно быть грубым. Это альтернатива основному ответу. Я просто предпочитаю этот, потому что другой «Cursor.Position» звучит как курсор текстового типа IMHO, а «MousePosition» более очевиден. - person James; 05.03.2013
comment
@ Ян Дворак, конечно, и да, я подумал, что это может быть полезно. Я бы сказал что-то вроде этого. Пожалуйста, не могли бы вы включить немного дополнительной информации, чтобы я мог видеть, как это может отличаться от ответов, данных ранее? - person James; 05.03.2013
comment
@JanDvorak Если вы думаете, что остроты не помогают (кстати, они помогают), то это не зависит от того, 1-дневный вопрос или 3-летний. +1 за альтернативный подход. - person nawfal; 07.05.2013

Чтобы получить позицию, посмотрите на событие OnMouseMove. MouseEventArgs даст вам позиции x и y...

protected override void OnMouseMove(MouseEventArgs mouseEv) 

Чтобы установить положение мыши, используйте свойство Cursor.Position.

http://msdn.microsoft.com/en-us/library/system.windows.forms.cursor.position.aspx

person Kevin LaBranche    schedule 22.08.2009

Если вам нужно получить текущую позицию в области формы (получено экспериментально), попробуйте:

Console.WriteLine("Current mouse position in form's area is " + 
    (Control.MousePosition.X - this.Location.X - 8).ToString() +
    "x" + 
    (Control.MousePosition.Y - this.Location.Y - 30).ToString()
);

Хотя экспериментальным путем были найдены 8 и 30 целые числа.

Было бы здорово, если бы кто-нибудь мог объяснить, почему именно эти цифры ^.


Кроме того, есть еще один вариант (учитывая, что код находится в CodeBehind формы):

Point cp = PointToClient(Cursor.Position); // Getting a cursor's position according form's area
Console.WriteLine("Cursor position: X = " + cp.X + ", Y = " + cp.Y);
person Angel    schedule 17.12.2018

Инициализировать текущий курсор. Используйте его, чтобы получить положение X и Y

this.Cursor = new Cursor(Cursor.Current.Handle);
int posX = Cursor.Position.X;
int posY = Cursor.Position.Y;
person DeathRs    schedule 14.07.2016

Вы также должны иметь следующие импорты, чтобы импортировать DLL

using System.Runtime.InteropServices;
using System.Diagnostics;
person Austin Traphofner    schedule 24.10.2019