2010-08-27 19 views
5

Estoy desarrollando una aplicación dirigida a un dispositivo POCKET PC 2003 (Windows CE 4.2) usando C++ y WINAPI nativo (es decir, sin MFC o similar). En él tengo un control de edición de línea única que parte de la ventana principal (no un diálogo); por lo tanto, el comportamiento normal de Windows al presionar ENTER es no hacer nada más que un pitido.¿Cómo desactivar el pitido al presionar ENTRAR en un control de EDIT de línea única bajo Windows CE?

He subclases el procedimiento de ventana para el control de edición para anular el comportamiento por defecto usando el siguiente código:


LRESULT CALLBACK Gui::ItemIdInputProc(HWND hwnd, UINT message, WPARAM wParam, 
    LPARAM lParam) { 

    switch (message) { 
     case WM_KEYDOWN : 
      switch (wParam) { 
       case VK_RETURN : 
        addNewItem(); 
        return 0; 
      } 
    } 

    return CallWindowProc(oldItemIdInputProc_, hwnd, message, wParam, lParam); 
} 

Esto hace que el comportamiento equivalente a pulsar el botón 'OK'.

Ahora al problema en cuestión: este procedimiento de ventana no anula el comportamiento predeterminado de hacer un pitido. Sospecho que debe haber algún otro mensaje o mensaje que se active cuando se presiona ENTER que no puedo capturar; Simplemente no puedo entender cuál. Realmente quiero detener el pitido del dispositivo ya que interfiere con otros sonidos que se reproducen en ciertas circunstancias cuando se produce una colisión del elemento, y es crucial que el usuario reciba una alerta al respecto.

Gracias de antemano.

+0

No sé si esto es cierto para Windows CE también, pero con el escritorio de Windows se obtiene navegación mediante el teclado en una ventana estándar llamando [IsDialogMessage ] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645498.aspx) como parte del envío de mensajes. Entre otras cosas, esto también trata con la tecla [Intro], invocando el botón predeterminado (si hay uno). – IInspectable

Respuesta

11

Después de arrojar todos los mensajes a un archivo de registro, finalmente pude averiguar cuál es el mensaje que estaba causando el pitido - WM_CHAR con wParam conjunto de VK_RETURN. Al detener el envío de ese mensaje al control de edición, se detuvo el pitido. ^^

El código final ahora se lee:


LRESULT CALLBACK Gui::ItemIdInputProc(HWND hwnd, UINT message, WPARAM wParam, 
    LPARAM lParam) { 

    switch (message) { 
     case WM_CHAR : 
      switch (wParam) { 
       case VK_RETURN : 
        addNewItem(); 
        return 0; 
      } 
    } 

    return CallWindowProc(oldItemIdInputProc_, hwnd, message, wParam, lParam); 
} 
0

Intente también manejar WM_KEYUP y devuelva 0 para VK_RETURN allí también - Windows non-CE también emite un pitido si no maneja el evento de tecla tanto hacia abajo como hacia arriba.

+0

No, no funcionó. Todavía pitido. – gablin

+0

... WM_CHAR - d'oh - ¡cuánto tiene que manejar para detener un pitido! :) –

+0

Aparentemente, solo ese mensaje. ^^ – gablin

0

tenía el mismo problema, pero gracias a ti, que finalmente logró desactivar el sonido.

// Run the message loop. It will run until GetMessage() returns 0 
while(GetMessage (&messages, NULL, 0, 0)) { 
    if(messages.message == WM_KEYDOWN && messages.wParam == VK_RETURN) { 
    sendChatMessage("sample text"); 
    continue; 
    } 

    // Translate virtual-key messages into character messages 
    TranslateMessage(&messages); 

    // Send message to WindowProcedure 
    DispatchMessage(&messages); 
} 

supongo que el truco consistía en no dejar que ejecutar esas dos declaraciones

2

que tenía el mismo problema pero con mi Rich Edit (mediante devolución de llamada también subclase). Este lado me ayudó mucho, pero lamentablemente la solución de Gablin no funcionó para mí. De alguna manera, no pude obtener el VK_RETURN del WM_CHAR. Pero desde el mensaje WM_KEYDOWN puedo :) También descubrí que, en mi caso, el pitido solo aparece si la edición enriquecida no usa el estilo ES_MULTILINE. Por lo tanto, esta es mi solución de trabajo en la Devolución de llamada para cambiar el tono si se presiona la tecla de retorno. Tal vez todavía puede ayudar a alguien que tiene el mismo problema :)

switch (message){ 
     case (WM_KEYDOWN) : { 
       switch (wParam) { 
       case VK_RETURN: 
        if ((GetWindowLong(this_editbox->getHandle(), GWL_STYLE) & ~ES_MULTILINE)){ //Only dissable return key if the rich edit is a single line rich edit         
         //Do something you want to do here if return key was pressed for ex. delete text with SetWindowTextA(hRichEdit, "");  after reading 
         return 0;// stop beep by blocking message 
        } 
       } 
      break; 
     } 
     default: break; 
} 
Cuestiones relacionadas