Foro de elhacker.net

Sistemas Operativos => Windows => Mensaje iniciado por: marax en 28 Julio 2020, 19:09 pm



Título: Alternativa a las Virtual Keys de Windows.
Publicado por: marax 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.


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: EdePC 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.


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: marax 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)


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: simorg en 28 Julio 2020, 23:41 pm
¿Y no seria más simple tener un teclado normal externo por USB?......





Saludos.


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: EdePC 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:

(https://sc02.alicdn.com/kf/HTB1s0p.LpXXXXXyXFXXq6xXFXXXc.jpg)

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


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: marax 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. }


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: Randomize 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.


Título: Re: Alternativa a las Virtual Keys de Windows.
Publicado por: marax en 2 Agosto 2020, 14:35 pm
Una app novedosa ...
No es una rueda. Es mi rueda.  :rolleyes: