Hilfe für ein Makro Programm

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Hilfe für ein Makro Programm

    Hi Leute,
    ich habe 2 Probleme mit einem kleinen Makro Programm das ich gerade schreibe.
    1. Die Tasten w und danach s sollen gedrückt gehalten werden, was dann in wwwwwwwwwwwwwwssssssssssssssss resultieren soll, allerdings wird nur ws augegeben.
    2. Die Befehle werden nicht an das Spiel Warframe weitergegeben (Makros sind in bestimmten Rahmen im Spiel erlaubt).

    Hier nun das Programm:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Public Counter As Integer
    4. Public Const KEYEVENTF_KEYUP As Byte = &H2
    5. Public Const KEYEVENTF_EXTENDEDKEY As Byte = &H1
    6. Dim WithEvents startstoptmr As New Timer
    7. Dim autostopcounter As Integer
    8. <DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, _
    9. CharSet:=CharSet.Unicode, EntryPoint:="keybd_event", _
    10. ExactSpelling:=True, SetLastError:=True)> _
    11. Public Shared Function keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, _
    12. ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32) As Boolean
    13. End Function
    14. Private Sub Start_Click(ByVal sEndr As System.Object, ByVal e As System.EventArgs) Handles Start.Click
    15. ForwardBack()
    16. Counter = 0
    17. Autostop()
    18. End Sub
    19. Private Sub Stopit_Click(ByVal sEndr As System.Object, ByVal e As System.EventArgs) Handles Stopit.Click
    20. Counter = 1
    21. startstoptmr.stop()
    22. End Sub
    23. Public Sub ForwardBack()
    24. Do While Counter <= 0
    25. If Counter <= 0 Then
    26. keybd_event(Keys.W, 0, 0, 0)
    27. Sleep(1000)
    28. keybd_event(Keys.W, 0, KEYEVENTF_KEYUP, 0)
    29. Sleep(200)
    30. If Counter <= 0 Then
    31. keybd_event(Keys.S, 0, 0, 0)
    32. Sleep(1000)
    33. keybd_event(Keys.S, 0, KEYEVENTF_KEYUP, 0)
    34. Sleep(200)
    35. End If
    36. End If
    37. Loop
    38. End Sub
    39. Sub Sleep(ByVal sleeptime As Integer)
    40. Dim Stopw As New Stopwatch
    41. Stopw.Start()
    42. Do Until Stopw.ElapsedMilliseconds >= sleeptime
    43. Application.DoEvents()
    44. Loop
    45. Stopw.Stop()
    46. Stopw.Reset()
    47. End Sub
    48. Public Sub Autostop()
    49. autostopcounter = 0
    50. startstoptmr.Interval = 10000
    51. startstoptmr.Start()
    52. End Sub
    53. Private Sub startstoptmr_Tick(ByVal sEndr As System.Object, ByVal e As System.EventArgs) Handles startstoptmr.Tick
    54. autostopcounter += 1
    55. If autostopcounter = 6 Then
    56. Counter = 1
    57. startstoptmr.stop()
    58. End If
    59. End Sub
    60. End Class

    Beschreib bitte mal präzise, was die

    unduku schrieb:

    VB.NET-Quellcode

    1. Public Sub ForwardBack()
    eigentlich tun soll.
    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!
    Das gleichzeitige Halten von mehreren Tasten kannst du nicht per keybd_event - Api an ein anderes Fenster schicken.

    Falls die Ziel-Anwendung auf gleichzeitiges Halten mehrerer Tasten reagiert, macht sie das vermutlich von sich aus aktiv, nämlich, indem sie in schneller Folge den Tasten-Status dieser Tasten abruft.

    Da ist mir aber kein Hack bekannt, wie man den TastaturTreiber dazu kriegen kann, auf Abruf für die Tasten W und S den Status "gedrückt" zurückzugeben, wenn sie nicht tatsächlich gedrückt sind.

    Das muss man getrennt sehen von Tastendrücken, denn Tastendrücke erzeugen eine Window-Message, die an die FensterHandle geht.
    Nein die sollen nicht gleichzeitig gedrückt werden, sondern erst die Taste W für eine sekunde drücken dann loslassen, und dann erst die taste S eine sekunde lang gedürckt halten und wieder loslassen. Also nacheinander.

    unduku schrieb:

    eine sekunde nach vorne laufen
    Warumm fragst Du 3 Mal in dieser Routine Counter <= 0 ab? Do While sollte reichen. Mach ein Boolean draus.

    unduku schrieb:

    Also nacheinander.
    Willst Du das AutoRepeat simulieren?
    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!
    ja als Autorepeat
    Den Counter habe ich eingesetzt damit ich die Bewegung jederzeit unterbrechen kann mit einem druck der Stop Taste, desweiteren sollen noch weitere Optonen eingebaut werden. So das man nachher nachbelieben 1-6 verschiedenen Makros nacheinander durchlaufen lässt die jeweils mit einem Click auf die Stop Taste unterbrochen werden können. Dies ist nur ein kleiner Auszug des Programms der die 2 Probleme die ich mit dem Programm habe darstellen soll.
    Wenn ich die Probleme für Forward/Back gelöst hab ist der Rest kein Thema mehr.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „unduku“ ()

    unduku schrieb:

    Den Counter habe ich eingesetzt
    Mach ein Boolean draus.
    Mach Dir eine Testfunktion zur Untersuchung des Mechanismus', das ganze ohne Do-While, sondern mit ein paar For-Schleifen.
    Pro Tastendruck musst Du ein Down- und ein Up-Event senden:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. TextBox1.Focus()
    3. keybd_event(CByte(Keys.W), 0, 0, 0)
    4. keybd_event(CByte(Keys.W), 0, KEYEVENTF_KEYUP, 0)
    5. Sleep(1000)
    6. For i = 1 To 10
    7. keybd_event(CByte(Keys.W), 0, 0, 0)
    8. keybd_event(CByte(Keys.W), 0, KEYEVENTF_KEYUP, 0)
    9. Sleep(200)
    10. Next
    11. keybd_event(CByte(Keys.S), 0, 0, 0)
    12. keybd_event(CByte(Keys.S), 0, KEYEVENTF_KEYUP, 0)
    13. Sleep(1000)
    14. For i = 1 To 10
    15. keybd_event(CByte(Keys.S), 0, 0, 0)
    16. keybd_event(CByte(Keys.S), 0, KEYEVENTF_KEYUP, 0)
    17. Sleep(200)
    18. Next
    19. 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!
    ja das würde da problem mit dem gedrückt halten umgehen, nur mache ich dann im Spiel immer nur ganz kleine Schriite und laufe nicht kontinuirlich eine sekunde lang vor und danach eine Sekunde zurück.
    Deswegen muss die Taste ja gedrückt gehalten werden. heißt also key_down W dann 1 sekunde warten und dann erst key_up W. Deswegen hatte ich ja die Pause zwischen den Key_down und Key_up aktionen.
    Desweiteren bleibt Problem 2 bestehen die Tastendrücke kommen beim Spiel nicht an.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „unduku“ ()

    unduku schrieb:

    Deswegen muss die Taste ja gedrückt gehalten werden.

    RodFromGermany schrieb:

    Mach Dir eine Testfunktion zur Untersuchung des Mechanismus', das ganze ohne Do-While, sondern mit ein paar For-Schleifen.
    Hast Du meinen Code getestet?
    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!
    ja haben ihn gestestet im Editor kommt die gewünschte augabe wwwwwwwwwsssssssss aber wenn ich das ganze im Spiel manuel mache also zehnmal w drücke und dann zehnmal s dann macht er eben nur die mini schritte.
    ich schreibe keine Antworten ohne eure Lösungsvorschläge vorher zu testen:-)

    unduku schrieb:

    dann macht er eben nur die mini schritte.
    Kannst Du bitte mal Deine Probleme vereinzeln?
    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!
    erstes Problem: die Tastendrücke werden nicht an das Spiel Warframe gesendet.
    zweites Problem: Drücke ich die Taste W kurz hintereinander (wie in deinem Code simuliert) mache ich nur kleine schritte, ich muss die Taste W aber gedrückt halten, um eine kotinuierliche Bewegung zu erhalten.

    und vielen Dank für Deine Hilfe ich weiß es sehr zu schätzen.

    unduku schrieb:

    die Tastendrücke werden nicht an das Spiel Warframe gesendet.
    Welches Programm und dort welches Fenster hat den Fokus (Siehe Post #8 Zeile 2)?
    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!

    unduku schrieb:

    Warframe soblad ich start drücke.

    RodFromGermany schrieb:

    und dort welches Fenster hat den Fokus
    Ist es dort das richtige Fenster?
    Probiere das ganze mal mit dem Notepad aus.
    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!

    unduku schrieb:

    aber im Spiel nicht.
    Dann ist zumindest Dein Code in Ordnung.
    Vielleicht solltest Du mit API.SendMessage() arbeiten, ich verweise mal auf ein Tut, welches ich demnächst zur Fernsteuerung von Applikationen posten werde.
    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!