[C con Clase] primer mensaje

Steven Davidson steven en conclase.net
Lun Mayo 28 22:06:31 CEST 2007


Hola Cristina,

El pasado 2007-05-28 18:05:53, Cristina escribió:

C> Es la primera vez que me apunto a algo así, así que es probable qu me equivoque con la finalidad de esta lista, me ha parecido que es en plan foro de preguntas, y yo tengo una pregunta, pero si no es así y me he equivocado pido mil perdones.

No. No te has equivocado. Pregunta cuanto desees acerca de C/C++, los cursos que presentamos en nuestra página, y en general sobre la programación e informática.

C> Por si acaso yo pregunto:
C> Cómo se captura programando en C con el API de windows(compilado con Visual Studio .NET, que es lo que tienen en la facultad) el presionado de las teclas control y "c" a la vez? en Unix es un SIGINT pero en Windows no sé que puedo hacer, ya que tampoco me vale una captura y comprobacion del CTRL y luego de la "C" por que no son dos pulsaciones.

Bajo una aplicación de MS-Windows, tenemos varias formas de averiguar esta y cualesquier combinaciones de teclas. Te presento algunas implementaciones:

1. Puedes procesar el mensaje WM_KEYDOWN, cuando se pulse una tecla. Como estamos manejando teclas, y no caracteres, usamos las teclas virtuales de MS-Windows. Por ejemplo,

  case WM_KEYDOWN:
    if( 'C' == wParam && GetKeyState(VK_CONTROL) >> 8 )
    {
      TCHAR szMsg[] = TEXT("CTRL+C");
      HDC hdc = GetDC( hwnd );
        TextOut( hdc, 10,10, szMsg, sizeof szMsg / sizeof(TCHAR) - 1 );
      ReleaseDC( hwnd, hdc );
    }
  break;
  ...
return DefWindowProc( hwnd, message, wParam, lParam );

Como puedes ver, tenemos que pasar 'wParam' invariable a 'TranslateMessage()'. Esto es porque esta función traducirá los mensajes asociados al teclado a caracteres enviando el mensaje 'WM_CHAR'.

También puedes observar que el código virtual de la tecla C equivale al carácter ASCII de 'C'.

Como el usuario puede haber pulsado la tecla C por sí sola, tenemos que comprobar si también hubo una pulsación de la tecla CTRL. Para esto, comprobamos el estado de tal tecla con 'GetKeyState()'. En general, podemos usar 'GetAsyncKeyState()'.

2. Registramos un "hot key" (no pienso traducir estas dos palabras en español). Esto se hace con la función 'RegisterHotKey()', pero tenemos que recordar cancelar el registro al final de nuestra aplicación, a más tardar, con la función 'UnregisterHotKey()'. Después de la registración, procesamos el mensaje 'WM_HOTKEY' si el usuario pulsa la combinación de teclas que registramos. Por ejemplo,

case WM_CREATE:
  RegisterHotKey( hwnd, 1, MOD_CONTROL, 'C' );
  ...

case WM_DESTROY:
  UnregisterHotKey( hwnd, 1 );
  ...

case WM_HOTKEY:
  if( 1 == wParam )
  {
    TCHAR szMsg[] = TEXT("CTRL+C");
    HDC hdc = GetDC( hwnd );
      TextOut( hdc, 10,120, szMsg, sizeof szMsg / sizeof(TCHAR) - 1 );
    ReleaseDC( hwnd, hdc );
    return 0;
  }
break;

El valor de 1 indica un número de identificación asociado al "hotkey" que registramos previamente.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase