Alternativa a las Virtual Keys de Windows.

Iniciado por Usuario887, 28 Julio 2020, 19:09 PM

0 Miembros y 2 Visitantes están viendo este tema.

Usuario887

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.

EdePC

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.

Usuario887

#2
Cita de: 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.
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 (cpp) [Seleccionar]
#include <stdio.h>
#include <windows.h>

#define is_pressed(x) (GetAsyncKeyState (x) & 0x8000)

inline void send_in (int c);
inline void exec_cmd (char *cmd);

bool fl_cmdalternative=false;

int main(int argc, char **argv)

int i, j, ascii;
    char in_buffer [BUFSIZ];
   
    //printf ("\r\n[dbg] started up");
   
    while (true)
    {
if (is_pressed (0x12))
{
//printf ("\r\n[dbg] <ALT>");
j=0;
while (is_pressed (0x12))
{
for (i=0;i<256;i++)
{
if ((i!=0x12)&(i!=0xa4))
if (is_pressed (i))
{
in_buffer[j]=i;
j++;
while (is_pressed (i));
}
}
}


in_buffer[j]='\0';
//filtering
if (in_buffer[0] != '\0')
{
if ((in_buffer[0]>0x29) & (in_buffer[0]<0x40))
{
//printf ("\r\n[dbg] numeric");
ascii=atoi (in_buffer);
if ((ascii>31)&(ascii<256)) send_in (atoi (in_buffer));
}
else if ((in_buffer[0]>0x40) & (in_buffer[0]<0x5b))
{

//printf ("\r\n[dbg] literal");
exec_cmd (in_buffer);
}
else{;}
}

}
else;
/*for (i=0;i<256;i++)
if (is_pressed (i))
{
if (i!=164)
{
send_in (i);
while (is_pressed (i));
}
}*/
}
       
return 0;
}

inline void send_in (int c)
{   
//se supone que esta funcion envia el caracter a la entrada del teclado
putchar (c); //lo envio a la salida estandar para verificar que funciona correctamente
return;
}

inline void exec_cmd (char *cmd)
{
char cmdexe[BUFSIZ];

printf ("\r\n[dbg] executing command: \'%s\'", cmd);

if (!strcmp (cmd, "CMD"))
{
system ("start cmd");
}
else if (!strcmp (cmd, "ENX"))
{
putchar ('\a');
fl_cmdalternative=true;
}
else if (!strcmp (cmd, "DISX"))
{
fl_cmdalternative=false;
}
else if (fl_cmdalternative)
{
strcpy (cmdexe, "start ");
strcat (cmdexe, cmd);
system (cmdexe);
}
else;

return;
}

(se que dije C pero me gusta unir C y C++ en la medida que se me haga comodo)

simorg

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





Saludos.

EdePC

Cita de: simorg en 28 Julio 2020, 23:41 PM
¿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.

Usuario887

#5
Cita de: simorg en 28 Julio 2020, 23:41 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 (cpp) [Seleccionar]

inline void send_in (char *in_buffer)
{  
   int i;
   INPUT in;

   /*printf ("\r\n[dbg] sending ascii key code: %s (%c)",
in_buffer,
atoi (in_buffer));*/

   in.type = INPUT_KEYBOARD;
   in.ki.wScan = 0;
   in.ki.time = 0;
   in.ki.dwExtraInfo = 0;

   in.ki.wVk = 0x12;
   in.ki.dwFlags = 0;
   SendInput(1, &in, sizeof(INPUT));
   
for (i=0;i<strlen (in_buffer);i++)
{
switch (in_buffer[i])
{
case '0':
send_numpad (&in, VK_NUMPAD0);
    break;
    case '1':
send_numpad (&in, VK_NUMPAD1);
    break;
    case '2':
send_numpad (&in, VK_NUMPAD2);
    break;
    case '3':
send_numpad (&in, VK_NUMPAD3);
    break;
    case '4':
send_numpad (&in, VK_NUMPAD4);
    break;
    case '5':
send_numpad (&in, VK_NUMPAD5);
    break;
    case '6':
send_numpad (&in, VK_NUMPAD6);
    break;
    case '7':
send_numpad (&in, VK_NUMPAD7);
    break;
    case '8':
send_numpad (&in, VK_NUMPAD8);
    break;
    case '9':
send_numpad (&in, VK_NUMPAD9);
    break;
    default: break;
}
}


   in.ki.wVk = 0x12;
   in.ki.dwFlags = KEYEVENTF_KEYUP;
   SendInput(1, &in, sizeof(INPUT));
   return;
}


y send_numpad:
Código (cpp) [Seleccionar]
inline void send_numpad (INPUT *in, int vk)
{
   in->ki.wVk = vk;
   in->ki.dwFlags = 0;
   SendInput(1, in, sizeof(INPUT));
   in->ki.dwFlags = KEYEVENTF_KEYUP;
   SendInput(1, in, sizeof(INPUT));
   return;
}

Randomize

#6
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.