Auf fremder Anwendung zeichnen und wieder löschen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    Auf fremder Anwendung zeichnen und wieder löschen

    Hallo zusammen!

    Ich bin auf der Suche nach einer Möglichkeit, mit VB auf oder "über" einer fremden Anwendung zu zeichnen und das Gezeichnete wieder zu löschen.

    Konkret geht es um folgendes:

    Ich möchte ein Tool erstellen, mit dem ich auf der ingame-Landkarte eines PC-Spiels (das auf DirectX9c basiert, falls das wichtig ist) Entfernungen messen kann. Das Spiel zeigt auf der Karte zwar einen Maßstab an, bietet aber keine Möglichkeit zur Berechnung der Entfernung. Ich hab mir das so vorgestellt, dass das Tool im Hintergrund läuft und über GetAsyncKeyState auf eine bestimmte Tastenkombination reagiert. Drückt man diese Tastenkombination, soll ausgehend von der Mausposition zum diesem Zeitpunkt eine gestrichelte Linie zur aktuellen Mausposition gezeichnet werden (im Prinzip wie die Linien-zeichnen-Funktion eines beliebigen Grafikprogramms), und neben dem Mauszeiger ein ToolTip-Fähnchen erscheinen, in dem die dynamisch gemessene Entfernung angezeigt wird. Drückt man die Tastenkombination erneut, verschwindet die Linie und der ToolTip wieder. Die ganze Logik zur Berechnung der Entfernung steht bereits (aus einem früheren Projekt, siehe unten) und ist hier daher gar nicht wichtig.

    Ich hab das Tool 2009 mit VB6 bereits realisiert, allerdings ohne die grafische Darstellung, weil ich das nicht hinbekommen hab. Ich hab damals mit verschiedenen API-Funktionen zwar auf den Windows-Desktop zeichnen können, allerdings konnte ich die gezeichneten Linien nicht mehr löschen, und sobald ich das Ganze über dem Spiel ausführte, war gar nichts zu sehen. Ich vermute, das Spiel hat die gezeichneten Linien einfach permanent mit sich selbst "überzeichnet". Ich bin deswegen damals einen anderen Weg gegangen, indem ich über Tastenkombinationen die Mauspositionen von Start- und Endpunkt der zu messenden Strecke ausgelesen, die Entfernung über Pythagoras und Dreisatz berechnet und das Ergebnis über entsprechend zusammengehängte .wav-Dateien akustisch ausgegeben habe. Das Ganze hat tadellos funktionert, war aber eben nicht das, was ich eigentlich wollte.

    Da ich mit VB.NET (ich hab die 2013 Community Edition installiert) noch überhaupt keine Erfahrungen gemacht habe, hatte ich mir überlegt, für den Anfang das ja bereits bestehende VB6-Projekt nach VB.NET zu portieren, um mich ein wenig einzuarbeiten. Natürlich würde ich dabei gerne die ursprünglich gewünschte Variante mit der grafischen Darstellung realisieren, sofern sich das mit VB.NET überhaupt machen lässt.

    Hat jemand zumindest vom Grundsatz her eine Idee, wie ich auf der Oberfläche des Spiels rumzeichnen kann? Sozusagen auf dem gleichen Niveau wie der Mauszeiger, der übrigens angezeigt wird, sobald man im Spiel die Karte öffnet (um mit der Karte zu interagieren usw.). Was ich bislang hinbekommen habe, ist über das e.Graphics-Objekt und GetDC auf dem Desktop rumzumalen, allerdings mit den gleichen Problemen wie damals - wenn ich auf dem Desktop zeichne, löscht die Aktualisierung anderer Anwendung das Gezeichnete teilweise, und auch ein gezieltes Löschen des Gezeichneten kriege ich nicht hin.

    Wäre vielleicht DirectX ein Ansatz? Oder gibt es über das Graphics-Objekt noch Möglichkeiten von denen ich nur nichts weiß?

    Bin für jeden Hinweis dankbar!

    Gruß BenzaPyren
    Willkommen im Forum. :thumbup:

    BenzaPyren schrieb:

    Möglichkeiten von denen ich nur nichts weiß?
    Vielleicht noch anders.
    Leg über diese Anwendung ein unsichtbares Fenster einer eigenen Anwendung, da kannst Du mit Mauskooerinaten machen was immer Du willst.
    Mach folgenten Test - Anwendung mit 2 Formen, Form1 hat einen Button:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Using dlg As New Form2
    3. dlg.Opacity = 0.5 ' dieser Wert hier
    4. dlg.ShowDialog()
    5. End Using
    6. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    schon mal Danke für deine Antwort!

    Das mit der unsichtbaren Form über der anderen Anwendung hab ich bei meiner bisherigen Suche auch irgendwo gelesen, ich glaube sogar, hier im Forum. Da stand dann aber die Frage im Raum, ob man durch die unsichtbare Form "hindurch" noch mit der darunter liegenden Anwendung interagieren kann? Weil letztlich - egal ob unsichtbar oder nicht - liegt die Form ja darüber, oder? Aber egal, ich werds auf jeden Fall ausprobieren. Wäre natürlich toll, wenns so einfach zu lösen wäre. Ich probiers und meld mich dann wieder hier!

    Gruß BenzaPyren