Auf ein anderes Fenster zeichnen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Fortender.

    Auf ein anderes Fenster zeichnen

    Hallo zusammen.

    Ich habe gerade versucht, ein Programm zu machen, mit dem ich sozusagen ein Overlay für andere Programme erzeugen kann. Im Prinzip funktioniert das auch, aber leider flackert das Overlay je nach Andwendung sehr stark, bzw ist kaum sichtbar.
    Beim notepad zum Beispiel ist es sehr gut sichtbar und flackert selbst wenn man Text darunter schreibt nur minimal, aber bei Need For Speed blitzt es höchstens im Menü hin und wieder mal auf.
    Weiß vielleicht einer eine Lösung für dieses Problem? Oder ist meine herangehensweise schon falsch?

    Timer2 gibt es, damit mein Programm nicht anfängt zu zeichnen, bevor das Zielprogramm geladen ist.

    VB.NET-Quellcode

    1. Dim wHandle As Long
    2. Dim game As Process
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Button1.Enabled = False
    5. Dim proID As Long
    6. proID = Shell(TextBox1.Text, AppWinStyle.NormalFocus)
    7. Button1.Text = proID
    8. game = Process.GetProcessById(proID)
    9. Timer2.Enabled = True
    10. End Sub
    11. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    12. Timer2.Enabled = False
    13. wHandle = game.MainWindowHandle
    14. Timer1.Enabled = True
    15. End Sub
    16. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    17. On Error GoTo fehler ' Prozess beendet
    18. Using g = Graphics.FromHwnd(wHandle)
    19. g.DrawImage(PictureBox1.Image, 20, 20, 200, 200)
    20. End Using
    21. Exit Sub
    22. fehler:
    23. Timer1.Enabled = False
    24. Button1.Enabled = True
    25. End Sub


    Every Lemming For Himself!
    Das was du mit GDI+ zeichnest wird natürlich mit jedem Frame von deinem Spiel wieder.
    Deine Anwendung muss ebenso auf das Window mittels DirectX/OpenGL/Vulkan oder ähnlichem auf das Window zeichnen, jedoch kann pro Window nur ein Kontext/GraphicsDevice/whatever vorhanden sein, weshalb du an den bereits vorhanden Kontext des Windows kommen musst-> Du brauchst eine DirectX/OpenGL/etc. injection, was mit .Net natürlich erst mal ein .Net gewrappe mit sich bringt, aber es ist möglich und gibt im Internet auch ein paar Anleitungen dazu
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Threadbare schrieb:

    herangehensweise schon falsch
    Was ist Dein Plan?
    Die andere Anwendung wird sich selbst darstellen, wenn sie es für erforderlich hält. Du übermalst lediglich Pixel an der Position des Programmes.
    Und:
    Zieh mal in Erwägung, ein VB.NET-Programm zu schreiben.
    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!

    jvbsl schrieb:

    das ist VB.Net

    Threadbare schrieb:

    VB.NET-Quellcode

    1. On Error GoTo
    auch. Ich weiß. ;)
    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!
    Kannst das ja External-ESP mäßig anstellen. Spiel im Fenstermodus laufen lassen und dein Fenster halt direkt drüberlegen. Dann kannst du auch einfach auf deins zeichnen halt mit nem transparenten Hintergrund.
    Falls du das so nicht möchtest wirst du glaub ich mal nicht um einen Direct3D Hook rumkommen.

    MfG Tim