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