2016-07-05 10 views
1

Ich habe versucht, ein Programm zur Anzeige von Mauszeigerbewegungen zu erstellen, indem ich Bilder basierend auf den Bewegungen erstellt habe. Das Problem besteht darin, dass die Anwendung in der Lage ist, Mausbewegungen auch dann zu erkennen und zu verfolgen, wenn sie nicht fokussiert/minimiert sind.Cursorposition holen, wenn alle Anwendungsformulare unscharf sind

Bis jetzt habe ich versucht, viele verschiedene Ansätze zu verwenden, wie globale Maus-Hooks. Der Code für das Mousemove-Ereignis ist unter (sp = Ausgangspunkt, ep = Endpunkt):

private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (k == 0) 
     { 
      ep = e.Location; 
      g = this.CreateGraphics(); 
      g.DrawLine(p, sp, ep); 
     } 
     sp = ep; 
    } 

Dieser Code funktioniert nur Mausbewegungen zu verfolgen, wenn die Form und die einzige Bewegung, über die Form konzentriert. Es gibt einen anderen Weg, wo ich die Bewegung außerhalb des Formulars verfolgen konnte, aber es funktioniert nicht mehr, wenn sich die Größe des Formulars ändert.

Was ist die richtige/beste Art, Bewegung mit einem globalen Maushaken oder ähnlichem zu verfolgen?

+3

Nicht verwandt mit Ihrer Frage, aber Sie werden wahrscheinlich später auf der Grundlage Ihres Beispielcodes dazu kommen; Wenn Sie sich jemals '.CreateGraphics' nennen, machen Sie wahrscheinlich 99,9% der Zeit etwas falsch. –

Antwort

1

Ich bin derzeit auf meinem Handy, werde aber mein Bestes tun, um es richtig für Sie zu bekommen.

Sie können dies tun, indem Sie eine der systemeigenen Funktionen aus der Klasse user32.dll aufrufen.

Dieses in Ihrer Klasse:

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

Und dann ist es wie folgt verwenden:

public static void Main(string[] args) 
{ 
     Point cursorPos; 
     GetCursorPos(out cursorPos); 
} 

Die cursorPos werden die X- und Y-Position der Maus haben.

+1

Ich gebe Ihnen Bonuspunkte nur für die Art, wie Sie diesen Text von einer Handytastatur formatiert haben. –

+1

Ich bin nur neugierig auf eine Sache: Warum machst du die WinAPI-Aufrufe selbst, wenn es eine [** 'Cursor.Position' **] (https://msdn.microsoft.com/en-us/library/system .windows.forms.cursor.position (v = vs.110) .aspx) Eigenschaft? –

+1

@VisualVincent Zwei Gründe. Ich glaube, jeder sollte mit WinAPI-Anrufen vertraut gemacht werden und er kann dies überall verwenden, ohne auf System.Windows.Forms verweisen zu müssen :) –