none
Immer noch ein kleines Problem mit dem simmulierten Drücken der STRG - links Taste RRS feed

  • Frage

  • Sorry  noch ein neuer Tread,
    @ Elmar, ich habe mir dein Letzten link angeschaut, aber scheinbar reicht meine Anfänger-Erfahrung nicht aus, um zu erkennen was Du mir damit sagen willst.
    Ich zeig hier mal in meinen Beispiel wie weit ich bin, und wo jetzt noch mein Problem liegt. Wie gesagt kann ich  mittlerweile eine Taste überwachen und beim drücken der Taste auch weiter Tastendrücke automatisieren. Leider klappt das  beim drücken der Strg-links Tasze immer noch nicht .

    Hier mal  ein kleiner Auszug aus meinen Programm, das mein Problem veranschaulichen soll, vieleicht habe ich auch irgendwo nur ein kleinen Denkfehler.
    wäre schön wenn ihr Euch das nochmal anschaut.
    Imports System.Windows.Forms
    Public Class Form1
    
        Private Declare Sub keybd_event Lib "user32" _
          (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        Const _KEYDOWN As Integer = 0
        Const _KEYUP As Integer = 2
    
        'Hier die Sub die das drücken der Taste STRG ermöglichen soll.
    
        ''' <summary> 
        ''' Taste Conrtol = STRG
        ''' </summary> 
        ''' <remarks></remarks> 
        Public Shared Sub Taste_STRG()
            Call keybd_event(CByte(Keys.ControlKey), 0, _KEYDOWN, 0)
            Call keybd_event(CByte(Keys.ControlKey), 0, _KEYUP, 0)
        End Sub
    
        'Abfragen der Zaste 4       Funktioniert !!!!!!
        Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long
        Private Const VK_4 = &H34  ' Taste 4
    
        ' Eine Kurze Pause bevor die nächste Taste gedrückt wird
    
        Private Declare Sub Sleep Lib "kernel32" Alias _
               "Sleep" (ByVal dwMilliseconds As Long)
    
        ' Der Timer fragt permanent ab, ob die Taste4 gedrückt wird und wenn Ja dann ...
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim Retval As Long
            Retval = GetAsyncKeyState(VK_4)
            If CBool(Retval And &H8000) Then     ' Wenn Taste 4 gedrückt wird dann......
                Sleep(800)                        ' Kurze Pause funktioniert!!!!
                My.Computer.Keyboard.SendKeys("3") ' drückt Taste 3 Funktioniert auch
                Sleep(800)                          ' Wieder kurze Pause
    
                Taste_STRG()                       'Taste STRG soll gedrückt werden Funktioniert aber nicht
                ' es Soll nur die Taste STRG gedrückt werden nix weiter
                                                   ' !!!!!Hier liegt mein Problem!!!!!!!
                Timer1.Start()
            End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Start()
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Timer1.Stop()
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    End Class
    Danke für die Hilfe bis jetzt, wenn ich Euch nicht hätte   (-:

    Gruß Ronny



    Freitag, 15. Januar 2010 14:00

Antworten

  • Hallo Ronny,

    mit Anfänger hat das nichts zu tun. Ich habe das auch noch nie probiert,
    bei mir fehlt schlicht und einfach die Notwendigkeit - und derzeit auch ein Spiel zum testen ;-)

    Wenn Du Dir im bereits geposteten http://www.codeproject.com/KB/system/keyboard.aspx
    die Beispiele am Ende anschaust, siehst Du das nicht nur der Tastaturcode sondern
    auch der Scancode - das ist, was die Tastatur roh sendet - übermittelt wird.

    Das es bei Dir nicht funktioniert kann ich mir (ohne Test) nur so erklären,
    dass das Spiel die Scancodes auswertet.

    Anstatt des InterOp Sleep solltest Du die Thread. Sleep-Methode für
    System.Threading.CurrentThread verwenden.

    Gruß Elmar

    • Als Antwort markiert Wild-Life78 Freitag, 15. Januar 2010 20:00
    Freitag, 15. Januar 2010 17:51
    Beantworter

Alle Antworten

  • Hallo Ronny,

    mit Anfänger hat das nichts zu tun. Ich habe das auch noch nie probiert,
    bei mir fehlt schlicht und einfach die Notwendigkeit - und derzeit auch ein Spiel zum testen ;-)

    Wenn Du Dir im bereits geposteten http://www.codeproject.com/KB/system/keyboard.aspx
    die Beispiele am Ende anschaust, siehst Du das nicht nur der Tastaturcode sondern
    auch der Scancode - das ist, was die Tastatur roh sendet - übermittelt wird.

    Das es bei Dir nicht funktioniert kann ich mir (ohne Test) nur so erklären,
    dass das Spiel die Scancodes auswertet.

    Anstatt des InterOp Sleep solltest Du die Thread. Sleep-Methode für
    System.Threading.CurrentThread verwenden.

    Gruß Elmar

    • Als Antwort markiert Wild-Life78 Freitag, 15. Januar 2010 20:00
    Freitag, 15. Januar 2010 17:51
    Beantworter
  • Danke Elmar
    Ich habe zwar noch nicht direckt die Lösung gefunden, aber das Thema ansich ist sehr interessant , bekomme gerade immer mehr raus, werde mich noch eine weile damit befassen. Der link hat mir viele andere Sachen aufgezeigt, mit denen ich gerade teste,   mir ist klar das das nicht jedem sein Intressengebiet ist, von daher werde ich mich da wohl alleine durchwühlen, Aber Dank Euch bin ich schon ein ganzes Stück weiter.

    Vielen Dank
    Freitag, 15. Januar 2010 20:00