Trotz __send("{lshift up}")__ wird Taste weiterhin gedrückt - warum? (Lösung: "shiftup/-down" verwenden)

  • Soo, ich habe momentan ein recht merkwürdiges Problem, für das ich keine Lösung finde...

    Problem: Ein bestimmtes Spiel von mir möchte unbedingt die linke Shift-Taste gedrückt haben um eine bestimmte Aktion auszuführen. Mir wäre es aber lieber, wenn ich dafür die rechte Shift-Taste belegen könnte.

    Gut, dachte ich mir, dann schreibe ich einfach ein AutoIt-Skript, was beim Drücken der rechten Shift-Taste mittels "send" die linke Shift-Taste benutzt. Dummerweise muss die Taste im Spiel auch gedrückt bleiben, sodass ich "up/down" mit dem send-Befehl anwenden muss.

    Nun denn, hier mal mein Quellcode:

    [autoit]

    #include <Misc.au3>

    [/autoit][autoit][/autoit][autoit]

    $dll = DllOpen("user32.dll")

    [/autoit][autoit][/autoit][autoit]

    while 1
    If _IsPressed("A1", $dll) Then
    Send("{lshift down}")
    Do
    sleep(100)
    Until _IsPressed("A1", $dll)
    Send("{lshift up}")
    EndIf
    Sleep(100)
    WEnd

    [/autoit]

    Ansich würde das Stückchen Quellcode einwandfrei funktionieren - wenn da nicht das Loslassen der Taste wäre! Aus irgendeinem Grund benimmt sich das Skript so, als würde ich die - trotz explizitem Befehl in Zeile 11 - linke Shift-Taste gedrückthalten. Sogar wenn ich das Skript dann beende, benimmt sich Windows so, als sei die linke Shift-Taste gedrückt. Nur wenn ich selbst per Hand (im wahrsten Wortsinn) die Taste einmal drücke und wieder loslasse, benimmt sich auch Windows so, als würde die Taste nichtmehr gedrückt.

    Das Phänomen lässt sich ganz einfach praktisch nachvollziehen:
    * Ich starte das Skript
    * Ich starte "Notepad"
    * Ich schreibe irgendeinen Müll in Notepad (zwanzig Mal den Buchstaben "a")
    * Ich drücke die rechte Shift-Taste und lasse sie wieder los
    * (Optional: Ich beende das Skript per Rechtsklick aufs Trayicon-Symbol -> "Exit")
    * Ich klicke mit der Maus ein wenig im Text herum
    |-> Der Text wird, ausgehend von der letzten Cursor-Position, markiert - ohne, dass irgendeine Shift-Taste gedrückt wäre! Erst, wenn ich selbst per Hand die linke Shift-Taste drücke und wieder loslasse, wird der Text nichtmehr markiert.


    Tjoar, Frage: Was ist da los? Verwende ich irgendeinen Befehl nicht richtig? Bin ich gar auf irgendeinen Bug o.Ä. gestoßen? Und das Wichtigste: Wie könnte ich dieses Problem lösen?

    Wär super, wenn mir jemand helfen könnte! :) Mein System ist btw. ein Windows Seven 64bit und DualCore-CPU, falls es wichtig wäre...

    2 Mal editiert, zuletzt von Manuel (9. Januar 2010 um 22:02)

  • nimm einfach {SHIFTDOWN} und {SHIFTUP}

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • nimm einfach {SHIFTDOWN} und {SHIFTUP}

    edit: Merke gerade, dass das auch nicht klappt...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • nimm einfach {SHIFTDOWN} und {SHIFTUP}

    edit: Merke gerade, dass das auch nicht klappt...

    Doch, es funktioniert einwandfrei - ich habe nur versehentlich vergessen, ein "Not" in Zeile 10 einzufügen (ich hab vorher ein wenig herumexperimentiert, bei "lshift down/up" war es egal, ob in Zeile 10 ein "Not" vorkommt oder nicht, beides erzielte denselben, scheinbar gedrücktgehaltenem Shift-Effekt). "shiftup/-down" funktioniert, aus welchen Gründen auch immer, einwandfrei. Danke dir :) . Ich muss mir mal wieder die Syntax genauer ansehen, ist schon einige Jahre her, dass ich mit AutoIt gearbeitet habe^^...

    Anbei das korrigierte Listing für alle, die ein ähnliches Problem haben:

    [autoit]

    #include <Misc.au3>

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{END}", "_ende")

    [/autoit][autoit][/autoit][autoit]

    $dll = DllOpen("user32.dll")

    [/autoit][autoit][/autoit][autoit]

    while 1
    If _IsPressed("A1", $dll) Then
    Send("{shiftdown}")
    Do
    sleep(100)
    Until Not _IsPressed("A1", $dll)
    Send("{shiftup}")
    EndIf
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func _ende()
    DllClose($dll)
    Exit(0)
    EndFunc

    [/autoit]