elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Sistemas Operativos
| |-+  Windows (Moderador: Randomize)
| | |-+  Alternativa a las Virtual Keys de Windows.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Alternativa a las Virtual Keys de Windows.  (Leído 4,252 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Alternativa a las Virtual Keys de Windows.
« en: 28 Julio 2020, 19:09 pm »

Hola. Estoy programando una utilidad pasiva para mi laptop con Windows que espera la pulsacion de la tecla ALT, graba lo que se teclee en seguida y, si se trata enteramente de una cantidad numerica, envie a la entrada del teclado el caracter ASCII correspondiente a la cifra. Me parecia que interrumpir el programa adecuadamente para verificar que se seguia presionando ALT me parecia bastante complicado hasta que me di cuenta de que Windows representa el teclado a traves de lo que llama Virtual Keys...  :rolleyes:

Mi pregunta es: ¿existe una forma de enviar caracteres ASCII (edito: o UNICODE) a la entrada del teclado en Windows? (el lenguaje es C).

Por ejemplo:
174 («)
175 (»)
...

(es decir, incluyendo caracteres extendidos)

Saludos.


« Última modificación: 28 Julio 2020, 19:18 pm por marax » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.176



Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #1 en: 28 Julio 2020, 21:17 pm »

Es para Linux supongo, porque en Windows funciona perfectamente Alt + 174 :xD, o no entiendo bien tu pregunto o que es lo que quieres lograr al final.


En línea

Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #2 en: 28 Julio 2020, 23:00 pm »

Es para Linux supongo, porque en Windows funciona perfectamente Alt + 174 :xD, o no entiendo bien tu pregunto o que es lo que quieres lograr al final.
Sabia que alguien se iba a confundir...
Eso funciona con el teclado numerico, pero no con el teclado estandar. (Yo tengo laptop, y sin teclado numerico :P)

Intento programar esta utilidad precisamente para que funcione con el teclado estandar. A veces necesito abrir interrogacion o utilizar corchetes angulares dobles y mi teclado no tiene tales teclas; me fastidia entrar en Google a cada rato a buscar "abrir interrogacion" u otro. Ademas me parece muy util por incluir una condicion para abrir la terminal de comandos con ALT+"CMD" (lo cual es mas practico que WIN+R+"cmd"+ENTER).

El codigo:
Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. #define is_pressed(x) (GetAsyncKeyState (x) & 0x8000)
  5.  
  6. inline void send_in (int c);
  7. inline void exec_cmd (char *cmd);
  8.  
  9. bool fl_cmdalternative=false;
  10.  
  11. int main(int argc, char **argv)
  12. {  
  13. int i, j, ascii;
  14.    char in_buffer [BUFSIZ];
  15.  
  16.    //printf ("\r\n[dbg] started up");
  17.  
  18.    while (true)
  19.    {
  20. if (is_pressed (0x12))
  21. {
  22. //printf ("\r\n[dbg] <ALT>");
  23. j=0;
  24. while (is_pressed (0x12))
  25. {
  26. for (i=0;i<256;i++)
  27. {
  28. if ((i!=0x12)&(i!=0xa4))
  29. if (is_pressed (i))
  30. {
  31. in_buffer[j]=i;
  32. j++;
  33. while (is_pressed (i));
  34. }
  35. }
  36. }
  37.  
  38.  
  39. in_buffer[j]='\0';
  40. //filtering
  41. if (in_buffer[0] != '\0')
  42. {
  43. if ((in_buffer[0]>0x29) & (in_buffer[0]<0x40))
  44. {
  45. //printf ("\r\n[dbg] numeric");
  46. ascii=atoi (in_buffer);
  47. if ((ascii>31)&(ascii<256)) send_in (atoi (in_buffer));
  48. }
  49. else if ((in_buffer[0]>0x40) & (in_buffer[0]<0x5b))
  50. {
  51.  
  52. //printf ("\r\n[dbg] literal");
  53. exec_cmd (in_buffer);
  54. }
  55. else{;}
  56. }
  57.  
  58. }
  59. else;
  60. /*for (i=0;i<256;i++)
  61. if (is_pressed (i))
  62. {
  63. if (i!=164)
  64. {
  65. send_in (i);
  66. while (is_pressed (i));
  67. }
  68. }*/
  69. }
  70.  
  71. return 0;
  72. }
  73.  
  74. inline void send_in (int c)
  75. {  
  76. //se supone que esta funcion envia el caracter a la entrada del teclado
  77. putchar (c); //lo envio a la salida estandar para verificar que funciona correctamente
  78. return;
  79. }
  80.  
  81. inline void exec_cmd (char *cmd)
  82. {
  83. char cmdexe[BUFSIZ];
  84.  
  85. printf ("\r\n[dbg] executing command: \'%s\'", cmd);
  86.  
  87. if (!strcmp (cmd, "CMD"))
  88. {
  89. system ("start cmd");
  90. }
  91. else if (!strcmp (cmd, "ENX"))
  92. {
  93. putchar ('\a');
  94. fl_cmdalternative=true;
  95. }
  96. else if (!strcmp (cmd, "DISX"))
  97. {
  98. fl_cmdalternative=false;
  99. }
  100. else if (fl_cmdalternative)
  101. {
  102. strcpy (cmdexe, "start ");
  103. strcat (cmdexe, cmd);
  104. system (cmdexe);
  105. }
  106. else;
  107.  
  108. return;
  109. }
(se que dije C pero me gusta unir C y C++ en la medida que se me haga comodo)
« Última modificación: 28 Julio 2020, 23:09 pm por marax » En línea

simorg
Ex-Staff
*
Desconectado Desconectado

Mensajes: 8.302



Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #3 en: 28 Julio 2020, 23:41 pm »

¿Y no seria más simple tener un teclado normal externo por USB?......





Saludos.
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.176



Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #4 en: 29 Julio 2020, 00:26 am »

¿Y no seria más simple tener un teclado normal externo por USB?......

Saludos.

Jaja, esas soluciones como las que te da el Soporte de Windows :xD

Para tu caso, deberías de revisar si no tienes alguna opción natural para tu teclado, es decir, yo he visto que las LapTop sin teclado numérico tienen una opción para utilizar ciertas teclas como si fueran las del teclado numérico, por ejemplo:



- Ves, ahí se presiona Fn y permite usar las teclas de la parte derecha como si fueran las del un teclado numérico.
En línea

Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #5 en: 29 Julio 2020, 17:49 pm »

¿Y no seria más simple tener un teclado normal externo por USB?......
Seria mas aburrido.

Mencionando el teclado numerico me hicieron darme cuenta de que en vez de todo el rollo de convertir Virtual Keys a UNICODE y enviarlas al teclado, etc. podia mas tranquilamente simular las teclas del teclado numerico. Gracias. Ahora funciona perfectamente; dejo el codigo de la funcion por si a alguien le interesa:

Código
  1. inline void send_in (char *in_buffer)
  2. {  
  3.    int i;
  4.    INPUT in;
  5.  
  6.    /*printf ("\r\n[dbg] sending ascii key code: %s (%c)",
  7. in_buffer,
  8. atoi (in_buffer));*/
  9.  
  10.    in.type = INPUT_KEYBOARD;
  11.    in.ki.wScan = 0;
  12.    in.ki.time = 0;
  13.    in.ki.dwExtraInfo = 0;
  14.  
  15.    in.ki.wVk = 0x12;
  16.    in.ki.dwFlags = 0;
  17.    SendInput(1, &in, sizeof(INPUT));
  18.  
  19. for (i=0;i<strlen (in_buffer);i++)
  20. {
  21. switch (in_buffer[i])
  22. {
  23. case '0':
  24. send_numpad (&in, VK_NUMPAD0);
  25.     break;
  26.     case '1':
  27. send_numpad (&in, VK_NUMPAD1);
  28.     break;
  29.     case '2':
  30. send_numpad (&in, VK_NUMPAD2);
  31.     break;
  32.     case '3':
  33. send_numpad (&in, VK_NUMPAD3);
  34.     break;
  35.     case '4':
  36. send_numpad (&in, VK_NUMPAD4);
  37.     break;
  38.     case '5':
  39. send_numpad (&in, VK_NUMPAD5);
  40.     break;
  41.     case '6':
  42. send_numpad (&in, VK_NUMPAD6);
  43.     break;
  44.     case '7':
  45. send_numpad (&in, VK_NUMPAD7);
  46.     break;
  47.     case '8':
  48. send_numpad (&in, VK_NUMPAD8);
  49.     break;
  50.     case '9':
  51. send_numpad (&in, VK_NUMPAD9);
  52.     break;
  53.     default: break;
  54. }
  55. }
  56.  
  57.  
  58.    in.ki.wVk = 0x12;
  59.    in.ki.dwFlags = KEYEVENTF_KEYUP;
  60.    SendInput(1, &in, sizeof(INPUT));
  61.    return;
  62. }
  63.  

y send_numpad:
Código
  1. inline void send_numpad (INPUT *in, int vk)
  2. {
  3.    in->ki.wVk = vk;
  4.    in->ki.dwFlags = 0;
  5.    SendInput(1, in, sizeof(INPUT));
  6.    in->ki.dwFlags = KEYEVENTF_KEYUP;
  7.    SendInput(1, in, sizeof(INPUT));
  8.    return;
  9. }
« Última modificación: 29 Julio 2020, 20:56 pm por marax » En línea

Randomize
Moderador
***
Desconectado Desconectado

Mensajes: 20.599


Beautiful Day


Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #6 en: 30 Julio 2020, 21:34 pm »

Estaban solas y marax se ha dicho: -"las hago compañía"  :¬¬



El teclado virtual tiene funciones de ayuda a ciertas personas, ¿qué te ha hecho ahora windows?

Una app novedosa ...


Haznos un video para que veamos dicha app novedosa.


Un saludo.
« Última modificación: 30 Julio 2020, 21:36 pm por Randomize » En línea

Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Alternativa a las Virtual Keys de Windows.
« Respuesta #7 en: 2 Agosto 2020, 14:35 pm »

Una app novedosa ...
No es una rueda. Es mi rueda.  :rolleyes:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines