Die
Wirkung ist, dass man alle Tasten der Tastartur und der Maus verwenden kann.
Ich hab' den Script nochma' geschrieben, weil ich die anderen Tastaturabfrage-Scripte alle zu unübersichtlich und lang zu schreiben finde.
(Der Script stammt komplett aus meiner Feder)
Hier das
Script:
Die lange Version mit Features und Kommentaren:
class W32API attr_reader :tasten #Der Hash der Tastennamen in Hexa-Code umwandelt attr_reader :retasten #Der Hash der Hexa-Code in Tastennamen umwandelt def initialize() @key_push = Win32API.new('user32', "GetAsyncKeyState", 'i', 'i') $key_press = Win32API.new('user32', "keybd_event", 'iiii', '') @tasten = Hash.new( #--------------------------Maus "l mouse" => 0x01, #Linke Maustaste "r mouse" => 0x02, #Rechte Maustaste "m mouse" => 0x04, #Mittlere Maustaste #--------------------------Special "back" => 0x08, #Backspace "tab" => 0x09, #Tabulator-Taste "enter" => 0x0D, #Enter "shift" => 0x10, #Eine der Shift-Tasten "strg" => 0x11, #Alt Gr-Taste oder eine der Strg-Tasten "alt" => 0x12, #Eine alt oder die Num-Block-Taste5 mit num lock "umschalt" => 0x14, #Umschalttaste "esc" => 0x1B, #Escape "space" => 0x20, #Leertaste #--------------------------Extra-Block "bild oben" => 0x21, "bild unten" => 0x22, "ende" => 0x23, "pos1" => 0x24, #--------------------------Pfeil "left" => 0x25, "links" => 0x25, #- "up" => 0x26, "hoch" => 0x26, #- "oben" => 0x26, #- "right" => 0x27, "rechts" => 0x27, #- "down" => 0x28, "unten" => 0x28, #- #--------------------------Extra-Block "snapshot" => 0x2C, "einfg" => 0x2D, "entf" => 0x2E, #--------------------------Zahlen "0" => 0x30, "1" => 0x31, "2" => 0x32, "3" => 0x33, "4" => 0x34, "5" => 0x35, "6" => 0x36, "7" => 0x37, "8" => 0x38, "9" => 0x39, #--------------------------Alphabet "a" => 0x41, "b" => 0x42, "c" => 0x43, "d" => 0x44, "e" => 0x45, "f" => 0x46, "g" => 0x47, "h" => 0x48, "i" => 0x49, "j" => 0x4A, "k" => 0x4B, "l" => 0x4C, "m" => 0x4D, "n" => 0x4E, "o" => 0x4F, "p" => 0x50, "q" => 0x51, "r" => 0x52, "s" => 0x53, "t" => 0x54, "u" => 0x55, "v" => 0x56, "w" => 0x57, "x" => 0x58, "y" => 0x59, "z" => 0x5A, #--------------------------Special "l windows" => 0x5B, #linke "Windows-Taste" "r windows" => 0x5C, #rechte "Windows-Taste" #--------------------------Num-Block "num 0" => 0x60, "num 1" => 0x61, "num 2" => 0x62, "num 3" => 0x63, "num 4" => 0x64, "num 5" => 0x65, "num 6" => 0x66, "num 7" => 0x67, "num 8" => 0x68, "num 9" => 0x69, "num *" => 0x6A, "num +" => 0x6B, "num -" => 0x6D, "num ," => 0x6E, "num /" => 0x6F, #--------------------------F-Zeichen "F1" => 0x70, "F2" => 0x71, "F3" => 0x72, "F4" => 0x73, "F5" => 0x74, "F6" => 0x75, "F7" => 0x76, "F8" => 0x77, "F9" => 0x78, "F10" => 0x79, "F11" => 0x7A, "F12" => 0x7B, #--------------------------Num-Block "num lock" => 0x90, #--------------------------Extra-Block "scroll" => 0x91, #--------------------------Special "l shift" => 0xA0, "r shift" => 0xA1, "l strg" => 0xA2, "r strg" => 0xA3, "l alt" => 0xA4, "alt gr" => 0xA5, #--------------------------Sonderzeichen "ü" => 0xBA, "+" => 0xBB, "," => 0xBC, "-" => 0xBD, "." => 0xBE, "#" => 0xBF, "ö" => 0xC0, #--------------------------Special "menü" => 0xD5, #--------------------------Sonderzeichen "ß" => 0xDB, "^" => 0xDC, "´" => 0xDD, "ä" => 0xDE, "<" => 0xE2 ) @tasten = @tasten[1] @retasten = @tasten.invert @nmomw = 1 @nmoma = -1 end #----------------------------------------------------------------------------- ####Rückgabe Wandelt einen String in die Zeichen um, die durch # drücken der Shift-Taste herauskommen ####Parameter #str :Der umzuwandelnde String #----------------------------------------------------------------------------- def shift_string(str) str = str.tr(('a'..'z').to_a.join+'^1234567890ß´äöü+#<,.-', ('A'..'Z').to_a.join+'°!"§$%&/()=?`ÄÖÜ*\'>;:_') return(str) end #----------------------------------------------------------------------------- ####Rückgabe Wandelt einen String in die Zeichen um, die durch # drücken der Alt Gr-Taste herauskommen ####Parameter #str :Der umzuwandelnde String #----------------------------------------------------------------------------- def altgr_string(str) str = str.tr('237890ßqe+<m', '²³{[]}\@€~|µ') return(str) end #----------------------------------------------------------------------------- ####Rückgabe True, wenn die Taste gerade angefangen wird zu drücken. ####Parameter #taste :Der Name der zu überprüfenden Taste #----------------------------------------------------------------------------- def an?(taste) if(@tasten[taste]) iff = @key_push.call(@tasten[taste]) if(iff < 0) ret=true else ret=false end return(ret) else return(false) end end #----------------------------------------------------------------------------- ####Rückgabe True, wenn die Taste gedrückt ist. ####Parameter #taste :Der Name der zu überprüfenden Taste #----------------------------------------------------------------------------- def press?(taste) if(@tasten[taste]) iff = @key_push.call(@tasten[taste]) if(iff != 0 and iff != 1) ret=true else ret=false end return(ret) else return(false) end end #----------------------------------------------------------------------------- ####Rückgabe True, wenn die Taste gedrückt ist. ####Parameter #taste :Der Hexadezimale Code der zu überprüfenden Taste #----------------------------------------------------------------------------- def pressc?(taste) if(@retasten[taste]) iff = @key_push.call(taste) if(iff != 0 and iff != 1) ret=true else ret=false end return(ret) else return(false) end end #----------------------------------------------------------------------------- #Drückt eine Taste Extrem kurz (Wird von anderen # Scripten nicht erfasst, aber von Windows ;) ) ####Parameter #taste :Gibt die Taste an, die gedrückt werden soll #----------------------------------------------------------------------------- def keypress(taste) keydown(taste) keyup(taste) end #----------------------------------------------------------------------------- #Drückt eine Taste ab jetzt ####Parameter #taste :Gibt die Taste an, die gedrückt werden soll #----------------------------------------------------------------------------- def keydown(taste) if(@tasten[taste]) $key_press.call(@tasten[taste], 0, 0x0, 0) end end #----------------------------------------------------------------------------- #Macht eine gedrückte Taste hoch ####Parameter #taste :Gibt die Taste an, die gehoben werden soll #----------------------------------------------------------------------------- def keyup(taste) if(@tasten[taste]) $key_press.call(@tasten[taste], 0, 0x2, 0) end endend$api = W32API.new
Die kurze einfache Version:
class W32API def initialize() @key_push = Win32API.new('user32', "GetAsyncKeyState", 'i', 'i') $key_press = Win32API.new('user32', "keybd_event", 'iiii', '') @tasten = Hash.new( #--------------------------Maus "l mouse" => 0x01, #Linke Maustaste "r mouse" => 0x02, #Rechte Maustaste "m mouse" => 0x04, #Mittlere Maustaste #--------------------------Special "back" => 0x08, #Backspace "tab" => 0x09, #Tabulator-Taste "enter" => 0x0D, #Enter "shift" => 0x10, #Eine der Shift-Tasten "strg" => 0x11, #Alt Gr-Taste oder eine der Strg-Tasten "alt" => 0x12, #Eine alt oder die Num-Block-Taste5 mit num lock "umschalt" => 0x14, #Umschalttaste "esc" => 0x1B, #Escape "space" => 0x20, #Leertaste #--------------------------Extra-Block "bild oben" => 0x21, "bild unten" => 0x22, "ende" => 0x23, "pos1" => 0x24, #--------------------------Pfeil "left" => 0x25, "links" => 0x25, #- "up" => 0x26, "hoch" => 0x26, #- "oben" => 0x26, #- "right" => 0x27, "rechts" => 0x27, #- "down" => 0x28, "unten" => 0x28, #- #--------------------------Extra-Block "snapshot" => 0x2C, "einfg" => 0x2D, "entf" => 0x2E, #--------------------------Zahlen "0" => 0x30, "1" => 0x31, "2" => 0x32, "3" => 0x33, "4" => 0x34, "5" => 0x35, "6" => 0x36, "7" => 0x37, "8" => 0x38, "9" => 0x39, #--------------------------Alphabet "a" => 0x41, "b" => 0x42, "c" => 0x43, "d" => 0x44, "e" => 0x45, "f" => 0x46, "g" => 0x47, "h" => 0x48, "i" => 0x49, "j" => 0x4A, "k" => 0x4B, "l" => 0x4C, "m" => 0x4D, "n" => 0x4E, "o" => 0x4F, "p" => 0x50, "q" => 0x51, "r" => 0x52, "s" => 0x53, "t" => 0x54, "u" => 0x55, "v" => 0x56, "w" => 0x57, "x" => 0x58, "y" => 0x59, "z" => 0x5A, #--------------------------Special "l windows" => 0x5B, #linke "Windows-Taste" "r windows" => 0x5C, #rechte "Windows-Taste" #--------------------------Num-Block "num 0" => 0x60, "num 1" => 0x61, "num 2" => 0x62, "num 3" => 0x63, "num 4" => 0x64, "num 5" => 0x65, "num 6" => 0x66, "num 7" => 0x67, "num 8" => 0x68, "num 9" => 0x69, "num *" => 0x6A, "num +" => 0x6B, "num -" => 0x6D, "num ," => 0x6E, "num /" => 0x6F, #--------------------------F-Zeichen "F1" => 0x70, "F2" => 0x71, "F3" => 0x72, "F4" => 0x73, "F5" => 0x74, "F6" => 0x75, "F7" => 0x76, "F8" => 0x77, "F9" => 0x78, "F10" => 0x79, "F11" => 0x7A, "F12" => 0x7B, #--------------------------Num-Block "num lock" => 0x90, #--------------------------Extra-Block "scroll" => 0x91, #--------------------------Special "l shift" => 0xA0, "r shift" => 0xA1, "l strg" => 0xA2, "r strg" => 0xA3, "l alt" => 0xA4, "alt gr" => 0xA5, #--------------------------Sonderzeichen "ü" => 0xBA, "+" => 0xBB, "," => 0xBC, "-" => 0xBD, "." => 0xBE, "#" => 0xBF, "ö" => 0xC0, #--------------------------Special "menü" => 0xD5, #--------------------------Sonderzeichen "ß" => 0xDB, "^" => 0xDC, "´" => 0xDD, "ä" => 0xDE, "<" => 0xE2 ) @tasten = @tasten[1] end def an?(taste) if(@tasten[taste]) iff = @key_push.call(@tasten[taste]) if(iff < 0) ret=true else ret=false end return(ret) else return(false) end end def press?(taste) if(@tasten[taste]) iff = @key_push.call(@tasten[taste]) if(iff != 0 and iff != 1) ret=true else ret=false end return(ret) else return(false) end end def keydown(taste) if(@tasten[taste]) $key_press.call(@tasten[taste], 0, 0x0, 0) end end def keyup(taste) if(@tasten[taste]) $key_press.call(@tasten[taste], 0, 0x2, 0) end endend$api = W32API.new
Einbau für RGSS-Programmierer:
Das Script muss irgendwo über Main hin.
Wie frage ich damit eine Taste ab?
(wenn ihr wissen wollt, ob gerade gehaltenwird) oder
(wenn ihr wissen wollt, ob gerade angefangen wurde, zu drücken)
Als Rückgabewert kommt "true" wenn die Taste gedrückt ist und "false", wenn die Taste nicht gedrückt ist, oder nicht existiert. Der Name der Tasten kann frei geändert werden, allerdings nicht das dazugehörige Hexadezimalzeichen.
Einbau für Event-Programmierer:
Ihr müsst oben auf den Scripteditor Gehen und dort auf dem Linken Bildschirmteil, irgendwo in den Text Rechtsklick machen und dann auf "Insert Ins" klicken. Jetzt einmal auf den Rechten Bildschirmteil klicken (wo ist egal) und dort den Script der oben steht einfügen. Jetzt den Scripteditor wieder schließen.
Wie frage ich damit eine Taste ab?
Wenn ihr jetzt in einem "Conditional Branch..." die Taste abfragen wollt müsst ihr im "Conditional Branch..."-Fenster auf der vierten seite unten bei "Script" den Punkt Markieren und
(wenn ihr wissen wollt, ob gerade gehaltenwird) oder
(wenn ihr wissen wollt, ob gerade angefangen wurde, zu drücken)
eintippen/rein kopieren (Natürlich müsst ihr "->Tastenname<-" durch den Tastenname der Taste ersetzen, die ihr abfragen wollt.)
Eine Liste der abfragbaren Tasten sind alle in Anführungszeichen geschriebenen Tastennamen die im Script vorkommen.
PS: Über Antworten freue ich mich immer! (auch über Kritik )
mfg
Miikku