Отримання позиції миші в 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
using System.Drawing;

/// <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
Як посилатися на тип POINT?
Manish Dubey

2
Додати посилання на System.Drawing
Bose_geek

1
приголомшливе рішення. Але вам не потрібно декларувати структуру POINT. Просто використовуйте простір імен Win32Interop.Structs.
Manpreet Singh Dhillon

@ManpreetSinghDhillon Чи доступний Win32Interop.Structs в .Net Core? Якщо так, під яким нульовим пакетом / посиланням на систему?
demonicdaron

@ManpreetSinghDhillon Використання власної структури дозволяє неявно відкидати її до будь-якої точки, яку ви використовуєте у своєму коді, це трохи плавніше. Якщо Win32Interop.Structs вам достатньо, то не забудьте йти вперед і використовувати це замість цього!
Mo0gles

17

Cursor.Position отримає поточне положення миші на екрані (якщо ви перебуваєте в елементі управління , властивість 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> Система.Windows.Forms> ok)


12
System.Windows.Forms.Control.MousePosition

Встановлює положення курсору миші в координатах екрана. "Властивість Position ідентична властивості Control.MousePosition."


4
Не потрібно бути грубим. Це альтернатива основній відповіді. Я просто віддаю перевагу цьому, тому що інший "Cursor.Position" звучить як текстовий курсор IMHO, а "MousePosition" є більш очевидним.
Джеймс

3
@Jan Dvorak впевнений, і так, я вважав, що це може бути корисним. Я б сказав щось подібне "Будь ласка, ви можете включити трохи додаткової інформації, щоб я міг бачити, як це може відрізнятися від відповідей, що були раніше?"
Джеймс

@JanDvorak Якщо ви думаєте, що одноколісні лайнери не допомагають (btw, вони це роблять), це не залежить від того, чи є питання 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 Form):

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.