Foros del Web » Programando para Internet » Javascript »

Sistema de Deteccion de Teclado mejorado

Estas en el tema de Sistema de Deteccion de Teclado mejorado en el foro de Javascript en Foros del Web. Hola, vengo aquí con mi problema que es el siguiente: Resulta que programando en Ruby, diseñé un sistema para detectar que teclas son precionadas mas ...
  #1 (permalink)  
Antiguo 10/01/2011, 21:28
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 3 meses
Puntos: 2
Exclamación Sistema de Deteccion de Teclado mejorado

Hola,

vengo aquí con mi problema que es el siguiente: Resulta que programando en Ruby, diseñé un sistema para detectar que teclas son precionadas mas facilmente. Y ahora quiero pasar el Script a JS, pero susede que, en Ruby para detectar el teclado usaba una Win32 API, pero como en JS no se puede usar eso, usé el evento onkeydown para detectar el teclado, pero susede que despues de aver precionado la tecla, si la detecta, pero la sigue detectando despues de aver soltado la tecla, entonses no se porque no me funciona.

Script Original Ruby:
Código Ruby:
Ver original
  1. module Keyboard
  2. #===============================================================================
  3. # ● List of Codes
  4. #===============================================================================
  5.   L_MOUSE   = 0x01;  R_MOUSE   = 0x02;  M_MOUSE   = 0x03;  ROLL_UP   = 0x04;
  6.   ROLL_DOWN = 0x05;  BACK      = 0x08;  TAB       = 0x09;  ENTER     = 0x0D;
  7.   SHIFT     = 0x10;  CTRL      = 0x11;  ALT       = 0x12;  PAUSE     = 0x13;
  8.   BLOQ_CAPS = 0x14;  ESCAPE    = 0x1B;  SPACE     = 0x20;  PAGE_UP   = 0x21;
  9.   PAGE_DOWN = 0x22;  _END      = 0x23;  HOME      = 0x24;  LEFT      = 0x25;
  10.   UP        = 0x26;  RIGHT     = 0x27;  DOWN      = 0x28;  SELECT    = 0x29;
  11.   PRINT     = 0x2A;  SNAPSHOT  = 0x2C;  INSERT    = 0x2D;  DELETE    = 0x2E;
  12.   NUM0      = 0x30;  NUM1      = 0x31;  NUM2      = 0x32;  NUM3      = 0x33;
  13.   NUM4      = 0x34;  NUM5      = 0x35;  NUM6      = 0x36;  NUM7      = 0x37;
  14.   NUM8      = 0x38;  NUM9      = 0x39;  A         = 0x41;  B         = 0x42;
  15.   C         = 0x43;  D         = 0x44;  E         = 0x45;  F         = 0x46;
  16.   G         = 0x47;  H         = 0x48;  I         = 0x49;  J         = 0x4A;
  17.   K         = 0x4B;  L         = 0x4C;  M         = 0x4D;  N         = 0x4E;
  18.   O         = 0x4F;  P         = 0x50;  Q         = 0x51;  R         = 0x52;
  19.   S         = 0x53;  T         = 0x54;  U         = 0x55;  V         = 0x56;
  20.   W         = 0x57;  X         = 0x58;  Y         = 0x59;  Z         = 0x5A;
  21.   L_WIN     = 0x5B;  R_WIN     = 0x5C;  APPS      = 0x5D;  NUMPAD0   = 0x60;
  22.   NUMPAD1   = 0x61;  NUMPAD2   = 0x62;  NUMPAD3   = 0x63;  NUMPAD4   = 0x64;
  23.   NUMPAD5   = 0x65;  NUMPAD6   = 0x66;  NUMPAD7   = 0x67;  NUMPAD8   = 0x68;
  24.   NUMPAD9   = 0x69;  MULTIPLY  = 0x6A;  ADD       = 0x6B;  SUBTRACT  = 0x6C;
  25.   SEPARATOR = 0x6D;  DECIMAL   = 0x6E;  DIVIDE    = 0x6F;  F1        = 0x70;
  26.   F2        = 0x71;  F3        = 0x72;  F4        = 0x73;  F5        = 0x74;
  27.   F6        = 0x75;  F7        = 0x76;  F8        = 0x77;  F9        = 0x78;
  28.   F10       = 0x79;  F11       = 0x7A;  F12       = 0x7B;  BLOQ_NUM  = 0x90;
  29.   BLOQ_SCROLL=0x91;  L_SHIFT   = 0xA0;  R_SHIFT   = 0xA1;  L_CONTROL = 0xA2;
  30.   R_CONTROL = 0xA3;  L_ALT     = 0xA4;  R_ALT     = 0xA5;  SEP       = 0xBC;
  31.   DASH      = 0xBD;  DOTT      = 0xBE;
  32. #===============================================================================
  33. # ● List of Names
  34. #===============================================================================
  35.   Names = {
  36.   0x01 => "LEFT CLICK",       0x02 => "RIGHT CLICK",
  37.   0x03 => "ROLL UP",          0x04 => "MIDDLE CLICK",
  38.   0x05 => "ROLL DOWN",        0x08 => "BAKC",
  39.   0x09 => "TAB",              0x0D => "ENTER",
  40.   0x10 => "SHIFT",            0x11 => "CONTROL",
  41.   0x12 => "ALT",              0x13 => "PAUSE",
  42.   0x14 => "BLOQ. CAPS.",      0x1B => "ESCAPE",
  43.   0x20 => "SPACE",            0x21 => "PAGE UP",
  44.   0x22 => "PAGE DOWN",        0x23 => "END",
  45.   0x24 => "INICIO",           0x25 => "LEFT",
  46.   0x26 => "UP",               0x27 => "RIGHT",
  47.   0x28 => "DOWN",             0x29 => "SELECTION",
  48.   0x2A => "PRINT",            0x2C => "PRINT SCREEN",
  49.   0x2D => "INSERT",           0x2E => "DELETE",
  50.   0x30 => "0",  0x31 => "1",  0x32 => "2",  0x33 => "3",
  51.   0x34 => "4",  0x35 => "5",  0x36 => "6",  0x37 => "7",
  52.   0x38 => "8",  0x39 => "9",  0x41 => "A",  0x42 => "B",
  53.   0x43 => "C",  0x44 => "D",  0x45 => "E",  0x46 => "F",
  54.   0x47 => "G",  0x48 => "H",  0x49 => "I",  0x4A => "J",
  55.   0x4B => "K",  0x4C => "L",  0x4D => "M",  0x4E => "N",
  56.   0x4F => "O",  0x50 => "P",  0x51 => "Q",  0x52 => "R",
  57.   0x53 => "S",  0x54 => "T",  0x55 => "U",  0x56 => "V",
  58.   0x57 => "W",  0x58 => "X",  0x59 => "Y",  0x5A => "Z",
  59.   0x5B => "LEFT WIN.",        0x5C => "RIGHT WIN.",
  60.   0x5D => "APPLICATIONS",     0x60 => "NUM 0",
  61.   0x61 => "NUM 1",            0x62 => "NUM 2",
  62.   0x63 => "NUM 3",            0x64 => "NUM 4",
  63.   0x65 => "NUM 5",            0x66 => "NUM 6",
  64.   0x67 => "NUM 7",            0x68 => "NUM 8",
  65.   0x69 => "NUM 9",            0x6A => "MULTIPLY",
  66.   0x6B => "ADDITION",         0x6C => "SEPARATOR",
  67.   0x6D => "SUBSTRACT",        0x6E => "DECIMAL",
  68.   0x6F => "DIVIDITION",          0x70 => "F1",
  69.   0x71 => "F2",   0x72 => "F3",   0x73 => "F4",  0x74 => "F5",
  70.   0x75 => "F6",   0x76 => "F7",   0x77 => "F8",  0x78 => "F9",
  71.   0x79 => "F10",  0x7A => "F11",  0x7B => "F12",
  72.   0x90 => "BLOQ. NUM.",           0x91 => "BLOQ. SCROLL",
  73.   0xA0 => "LEFT SHIFT",      0xA1 => "RIGHT SHIFT",
  74.   0xA2 => "LEFT CONTROL",    0xA3 => "RIGHT CONTROL",
  75.   0xA4 => "LEFT ALT",        0xA5 => "RIGHT ALT",
  76.   0xBC => "SEP",  0xBD => "DASH",  0xBE => "DOTT"
  77.   }  
  78.   GetKeyState = Win32API.new("user32", "GetAsyncKeyState", "i", "i")
  79.   KeyRepeatCounter = {}
  80.  
  81.   module_function
  82.  
  83.   def self.update
  84.     for key in KeyRepeatCounter.keys
  85.       if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
  86.         KeyRepeatCounter[key] += 1
  87.       else
  88.         KeyRepeatCounter.delete(key)
  89.       end
  90.     end
  91.   end
  92.   def self.press?(key)
  93.     return false if key == nil
  94.     return true unless KeyRepeatCounter[key].nil?
  95.     return key_pressed?(key)
  96.    end
  97.   def self.trigger?(key)
  98.     return false if key == nil
  99.     count = KeyRepeatCounter[key]
  100.     press = count.nil? ? key_pressed?(key) : false
  101.     return (count == 0 or press)
  102.   end
  103.   def self.repeat?(key)
  104.     return false if key == nil
  105.     count = KeyRepeatCounter[key]
  106.     return true if count == 0
  107.     if count.nil?
  108.       return key_pressed?(key)
  109.     else
  110.       return (count >= 23 and (count - 23) % 6 == 0)
  111.     end
  112.   end
  113.   def self.key_pressed?(key)
  114.     if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
  115.       KeyRepeatCounter[key] = 0
  116.       return true
  117.     end
  118.     return false
  119.   end
  120.   def self.getKey
  121.     for i in 0...256
  122.       if GetKeyState.call(i) == -32767
  123.         key = i
  124.         break
  125.       end
  126.     end
  127.     return if key == nil
  128.     return Names[key] != nil ? key : 0
  129.   end
  130. end

Adaptado JS:

Código Javascript:
Ver original
  1. Keyboard = {
  2.     keyLog:[],
  3.     setup:function () {
  4.         document.onkeypress = function(event) {
  5.             Keyboard.keyCode = event == null ? window.event.keyCode : event.keyCode
  6.         }
  7.     },
  8.     update:function () {
  9.         for (var i in Keyboard.KeyLog) {
  10.             if (Keyboard.keyCode == i) {
  11.                 Keyboard.keyLog[i]++
  12.             } else {
  13.                 Keyboard.keyLog[i] = undefined
  14.             }
  15.         }
  16.     },
  17.     press: function (key) {
  18.         if (key == undefined) return false;
  19.         if (Keyboard.keyLog[key] != undefined) return true;
  20.         return Keyboard.keyPressed(key)
  21.     },
  22.     trigger:function (key) {
  23.         if (key == undefined) return false;
  24.         return (Keyboard.keyLog[key] == 0 || (Keyboard.keyLog[key] == undefined ? Keyboard.keyPressed(key) : false))
  25.     },
  26.     repeat:function (key) {
  27.         if (key == undefined) return false;
  28.         if (Keyboard.keyLog[key] == 0) return true;
  29.         if (Keyboard.keyLog[key] == undefined) {
  30.             return Keyboard.keyPressed(key)
  31.         } else {
  32.             return (Keyboard.keyLog[key] >= 23 && (Keyboard.keyLog[key] - 23) % 6 == 0)
  33.         }
  34.     },
  35.     keyPressed:function (key) {
  36.         if (Keyboard.keyCode == key) {
  37.             Keyboard.keyLog[key] = 0
  38.             return true
  39.         }
  40.         return false
  41.     }
  42. }

Demo de su funcionamiento:

Código Javascript:
Ver original
  1. Keyboard.setup();
  2. setInterval(checkInput,1);
  3. function checkInput () {
  4.   Keyboard.update();
  5.   if (Keyboard.trigger(13)) {
  6.     alert('has precionado Enter')
  7. }
  8. }
  #2 (permalink)  
Antiguo 10/01/2011, 22:33
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Sistema de Deteccion de Teclado mejorado

y con onkeyup, te envia una sola detección al soltar la tecla

onkeypress me parece que se acerca mas a lo tuyo pero hay ciertas teclas que no las considera como lo hace onkeydown y onkeyup

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #3 (permalink)  
Antiguo 10/01/2011, 23:12
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 3 meses
Puntos: 2
Respuesta: Sistema de Deteccion de Teclado mejorado

ya intenté con los 3 pero todos me dan el mismo resultado
  #4 (permalink)  
Antiguo 10/01/2011, 23:35
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: Sistema de Deteccion de Teclado mejorado

Para obtener el keyCode en todos los navegadores tenés que usar keydown en lugar de keypress. Mirá este enlace: http://www.quirksmode.org/js/keys.html
Igualmente no comprendo bien tu objetivo ni a qué te estás refiriendo con mejorar la detección del teclado.
  #5 (permalink)  
Antiguo 11/01/2011, 00:12
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 3 meses
Puntos: 2
Respuesta: Sistema de Deteccion de Teclado mejorado

Loque eintento hacer es detectar la pulsacion en el momento de que nesesite, y no esperar a onkeydown para que ejecute la accion
  #6 (permalink)  
Antiguo 11/01/2011, 15:49
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 3 meses
Puntos: 2
Respuesta: Sistema de Deteccion de Teclado mejorado

Ya encontré el problema... susede que al precionar la tecla, se asigna el jeyCode, pero al soltarla se mantiene ese keyCode, y eso el lo que detecta el Script... de todas farmas sigue sin funcionar el Script
  #7 (permalink)  
Antiguo 12/01/2011, 06:51
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Sistema de Deteccion de Teclado mejorado

pero que quieres hacer realmente??
tienes que explicarte con lujo de detalle para ver si alguien ha llegado a lo que pides quizá por otro camino.

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #8 (permalink)  
Antiguo 12/01/2011, 20:34
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 3 meses
Puntos: 2
Respuesta: Sistema de Deteccion de Teclado mejorado

En pocas palabras lo que quiero hacer es detectar el teclado usando una comparacion o sea algo asi:

Código Javascript:
Ver original
  1. if (detectaTeclado(13)) {
  2.   alert("Has precionado Enter")
  3. }
  #9 (permalink)  
Antiguo 12/01/2011, 21:26
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Sistema de Deteccion de Teclado mejorado

bueno , aqui puede ver como funcionan los eventos key

http://perr0.netii.net/teclado.htm

con ello te puedes ayudar para armar tu mapa de deteccion de teclado

salu2

segundo boton para ver el codigo
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip

Etiquetas: deteccion, teclado, sitemap, mejoras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:55.