Miikkus Tastaturskript

#1

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?


$api.press?(->Tastenname<-)

(wenn ihr wissen wollt, ob gerade gehaltenwird) oder

$api.an?(->Tastenname<-)

(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

$api.press?(->Tastenname<-)

(wenn ihr wissen wollt, ob gerade gehaltenwird) oder

$api.an?(->Tastenname<-)

(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 :D )


mfg
Miikku

Zitieren
#2

Die Idee finde ich nicht schlecht einen Script zu entwerfen womit man alle tasten abfragen kann.^^
Im gegensatz zum rpg maker 2000 braucht man den User nicht mit der installation eines Tastenpatches ärgern, einfach einbauen und der User kann belegte tasten einsetzten.
Testen kann ichs erst mal nicht aber ich denke das GR-FoxDie sich die Zeit nimmt mal deine Scripts auzuschauen.;)
Ich bin überrascht das jemand mit 14 Jahren so etwas schon zustande bringen kann.^^

Dein bisschen Zorn ist nur ein endloser Ozean des Tötens auf dieser scheiß Welt. Es gibt keinen Anfang und kein Ende.
Zitieren
Anmelden oder Registrieren, um zu antworten.