Autor
|
Tema: Alternativa a las Virtual Keys de Windows. (Leído 4,100 veces)
|
Usuario887
Desconectado
Mensajes: 310
|
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... 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
|
Es para Linux supongo, porque en Windows funciona perfectamente Alt + 174 , o no entiendo bien tu pregunto o que es lo que quieres lograr al final.
|
|
|
En línea
|
|
|
|
Usuario887
Desconectado
Mensajes: 310
|
Es para Linux supongo, porque en Windows funciona perfectamente Alt + 174 , 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 ) 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: #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)
|
|
« Última modificación: 28 Julio 2020, 23:09 pm por marax »
|
En línea
|
|
|
|
simorg
Ex-Staff
Desconectado
Mensajes: 8.302
|
¿Y no seria más simple tener un teclado normal externo por USB?......
Saludos.
|
|
|
En línea
|
|
|
|
EdePC
|
¿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 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
Mensajes: 310
|
¿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: 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: 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; }
|
|
« Última modificación: 29 Julio 2020, 20:56 pm por marax »
|
En línea
|
|
|
|
Randomize
|
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
Mensajes: 310
|
Una app novedosa ...
No es una rueda. Es mi rueda.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
CREATE TABLE <name> LIKE <name> importando primary keys and foreign keys
Bases de Datos
|
Kasswed
|
2
|
5,329
|
3 Febrero 2010, 16:32 pm
por ssccaann43 ©
|
|
|
Problema con System.Windows.Forms.Keys y Space(LOF(1))
.NET (C#, VB.NET, ASP)
|
chacKos
|
7
|
6,741
|
14 Marzo 2010, 13:13 pm
por chacKos
|
|
|
¿cuál es la alternativa de Microsoft microsoft virtual desktop infrastructure?
GNU/Linux
|
Platanito Mx
|
0
|
1,558
|
17 Octubre 2014, 18:46 pm
por Platanito Mx
|
|
|
Así hackean cajeros con Windows XP usando las ‘Sticky Keys’
Noticias
|
wolfbcn
|
2
|
1,885
|
27 Diciembre 2017, 15:08 pm
por #!drvy
|
|
|
Instala Windows 10 sin claves: descubre las keys genéricas de Microsoft
Noticias
|
wolfbcn
|
0
|
2,108
|
6 Diciembre 2019, 21:13 pm
por wolfbcn
|
|