Pergunta

Como obter a coordenação atual do mouse na tela? Eu sei apenas Mouse.GetPosition() que obtém mouseposição de elemento, mas quero obter a coordenação sem usar o elemento.

Foi útil?

Solução

Para acompanhar a resposta de Rachel.
Aqui estão duas maneiras pelas quais você pode obter coordenadas da tela do mouse no WPF.

1. Usando formulários do Windows. Adicione uma referência ao System.Windows.Forms

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2. Usando Win32

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
    public Int32 X;
    public Int32 Y;
};
public static Point GetMousePosition()
{
    Win32Point w32Mouse = new Win32Point();
    GetCursorPos(ref w32Mouse);
    return new Point(w32Mouse.X, w32Mouse.Y);
}

Outras dicas

Ou em uso puro do WPF Pointtoscreen.

Método Auxiliar de Amostra:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}

Deseja coordenadas em relação à tela ou ao aplicativo?

Se estiver dentro do aplicativo, basta usar:

Mouse.GetPosition(Application.Current.MainWindow);

Caso contrário, acredito que você pode adicionar uma referência a System.Windows.Forms E use:

System.Windows.Forms.Control.MousePosition;

Se você tentar muitas dessas respostas em diferentes resoluções, computadores com vários monitores etc., poderá achar que eles não funcionam de maneira confiável. Isso ocorre porque você precisa usar uma transformação para obter a posição do mouse em relação à tela atual, não a toda a área de visualização que consiste em todos os seus monitores. Algo assim ... (onde "isso" é uma janela WPF).

var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var mouse = transform.Transform(GetMousePosition());

public System.Windows.Point GetMousePosition()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}

Isso funciona sem ter que usar formulários ou importar qualquer DLLs:

   using System.Windows;
   using System.Windows.Input;

    /// <summary>
    /// Gets the current mouse position on screen
    /// </summary>
    private Point GetMousePosition()
    {
        // Position of the mouse relative to the window
        var position = Mouse.GetPosition(Window);

        // Add the window position
        return new Point(position.X + Window.Left, position.Y + Window.Top);
    }

Você pode usar a combinação de TimerDispatcher (WPF Timer Analog) e Windows "Hooks" para capturar a posição do cursor do sistema operacional.

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

Ponto é uma luz struct. Ele contém apenas campos x, y.

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
        dt.Tick += new EventHandler(timer_tick);
        dt.Interval = new TimeSpan(0,0,0,0, 50);
        dt.Start();
    }

    private void timer_tick(object sender, EventArgs e)
    {
        POINT pnt;
        GetCursorPos(out pnt);
        current_x_box.Text = (pnt.X).ToString();
        current_y_box.Text = (pnt.Y).ToString();
    }

    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

Esta solução também está resolvendo o problema com a leitura de parâmetros com muita frequência ou pouco frequente, para que você possa ajustá -lo sozinho. Mas lembre -se de sobrecarregar o método WPF com um arg que está representando ticks não milliseconds.

TimeSpan(50); //ticks

Se você está procurando um revestimento de 1, isso se sai bem.

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)

Eu adiciono isso para uso com controles

   private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
 var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };

}

Mouse.GetPosition(mWindow) fornece a posição do mouse em relação ao parâmetro de sua escolha.mWindow.PointToScreen() Converta a posição em um ponto em relação à tela.

Então mWindow.PointToScreen(Mouse.GetPosition(mWindow)) fornece a posição do mouse em relação à tela, assumindo que mWindow é uma janela (na verdade, qualquer classe derivada de System.Windows.Media.Visual terá essa função), se você estiver usando isso dentro de uma classe de janela WPF, this Deveria trabalhar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top