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:
Código
(se que dije C pero me gusta unir C y C++ en la medida que se me haga comodo)
#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; }