Получение позиции мыши в c #

117

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

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

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

Изменить: это должно произойти до создания формы.

Ативат Чунлахан
источник

Ответы:

180

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

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

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

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;
}
Mo0gles
источник
1
Как ссылаться на тип ТОЧКИ?
Manish Dubey
2
Добавить ссылку на System.Drawing
Bose_geek 04
1
отличное решение. Но вам не нужно объявлять struct POINT. Просто используйте пространство имен Win32Interop.Structs.
Манприт Сингх Диллон,
@ManpreetSinghDhillon Доступен ли Win32Interop.Structs в .Net Core? Если да, то в каком справочнике по пакету / системе nuget?
demonicdaron,
@ManpreetSinghDhillon Использование вашей собственной структуры позволяет вам неявно приводить ее к любой точке, которую вы используете в своем коде, это немного более плавно. Если вам достаточно Win32Interop.Structs, тогда используйте его!
Mo0gles
17

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

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

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

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

adrianbanks
источник
16

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

// 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)

Бенджамин Крузье
источник
12
System.Windows.Forms.Control.MousePosition

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

Джеймс
источник
4
Не нужно быть грубым. Это альтернатива основному ответу. Я просто предпочитаю этот, потому что другой «Cursor.Position» звучит как курсор текстового типа ИМХО, а «MousePosition» более очевиден.
Джеймс
3
@Jan Dvorak уверен, и да, я подумал, что это может быть полезно. Я бы сказал что-то вроде этого: «Пожалуйста, не могли бы вы включить немного дополнительной информации, чтобы я мог увидеть, чем она может отличаться от ответов, данных ранее?»
Джеймс
@JanDvorak Если вы думаете, что однострочные сообщения не помогают (кстати, они помогают), тогда это не зависит от того, был ли вопрос 1 день или 3 года. +1 за альтернативный подход.
nawfal
6
   internal static class CursorPosition {
  [StructLayout(LayoutKind.Sequential)]
  public struct PointInter {
     public int X;
     public int Y;
     public static explicit operator Point(PointInter point) => new Point(point.X, point.Y);       
  }

  [DllImport("user32.dll")]
  public static extern bool GetCursorPos(out PointInter lpPoint);

  // For your convenience
  public static Point GetCursorPosition() {
     PointInter lpPoint;
     GetCursorPos(out lpPoint);
     return (Point) lpPoint;
  }

}

Карлос Альберто Флорес Онофре
источник
3

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

this.Cursor = new Cursor(Cursor.Current.Handle);
int posX = Cursor.Position.X;
int posY = Cursor.Position.Y;
DeathRs
источник
3

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

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 = this.PointToClient(Cursor.Position); // Getting a cursor's position according form's area
Console.WriteLine("Cursor position: X = " + cp.X + ", Y = " + cp.Y);
F8ER
источник
0

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

using System.Runtime.InteropServices;
using System.Diagnostics;
Остин Трафофнер
источник