2011-01-02 7 views
5

Básicamente quiero un Enter para activar un mensaje que puedo capturar cuando un control de edición se enfoca y un usuario presiona enter. Todas las soluciones en línea parecen ser sobre subclases, pero me preguntaba si había otra forma de evitarlo.win32 C++ detectando 'enter' en un control de edición sin subclases?

Por ejemplo, mi botón tiene un identificador ID_BUTTON_SEND. Así es como lo imagino;

case WM_COMMAND: 
    switch (LOWORD(wParam)) 
      case ID_BUTTON_SEND 
       if ('enter was pressed') 
         do this 
       else 
         default 

... usted consigue la idea :) He leído la opción http://support.microsoft.com/kb/102589 pero francamente 1 dosn't tienen mucho sentido para mí.

Saludos

Respuesta

3

mejor forma de detectar esto es antes de TranslateMessage se llama. Por lo tanto, si usa MFC, anule CWnd :: PreTranslateMessage. Si usa solo Win API, simplemente revise en su mensaje de bombeo qué contiene el mensaje antes de la llamada a TranslateMessage.

+0

¿Qué mensaje busco? WM_CHAR, WM_KEYPRESS o algo así? Además, ¿tiene esto un impacto en el rendimiento, al hacer esta comprobación cada vez que se recibe un mensaje? – KaiserJohaan

+0

No se preocupe por problemas de rendimiento, son negligentes. Sin embargo, olvidé qué mensaje buscar :) pero como todavía no se tranastró, creo que WM_KEYDOWN sería el que debería buscar. (o WM_KEYUP también). – kellogs

3

Puede atrapar el evento de cambio de enfoque y cuando el control de edición obtiene el evento de enfoque simplemente cambie el botón predeterminado de diálogo para que sea el botón * ID_BUTTON_SEND *. Luego, cuando se pierde el foco, elimine este indicador de botón predeterminado.

Eso significa que siempre que el usuario presione enter cuando el control de edición tenga las foucs, el cuadro de diálogo dispararía automáticamente el botón predeterminado * ID_BUTTON_SEND *.

Usted puede hacer que el botón el botón predeterminado añadiendo el BS_DEFPUSHBUTTON a la GWL_STYLE del botón.

2

Solo para reiterar sobre el artículo de KB. Para la opción 1, simplemente puede manejar IDOK en WM_COMMAND.

case WM_COMMAND: 
    if(wParam == IDOK){ 
    ENTER WAS PRESSED 
    }else{ 
    REGULAR EVENT HANDLING 
    } 

Esta es una forma mucho más fácil y más limpia de verificar la entrada.

+0

¡Gracias! He intentado rastrear eso durante días. Para el OP, puede verificar el HWND del control, ya que está en su lparam. –

Cuestiones relacionadas