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


117

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

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

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

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

Ответы:


180

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


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;
}

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методе до создания формы.


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;

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

0

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

using System.Runtime.InteropServices;
using System.Diagnostics;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.