Come disattivare il segnale acustico quando si preme INVIO su un controllo EDIT singola linea sotto Windows CE?

StackOverflow https://stackoverflow.com/questions/3588526

Domanda

Sto sviluppando un'applicazione mirata ad un Pocket PC 2003 (Windows CE 4.2) dispositivo utilizzando C ++ e WINAPI nativo (vale a dire senza MFC o simili). In esso ho un controllo di modifica a riga singola quale parte della finestra principale ( non una finestra); da qui il comportamento normale di Windows quando il tasto ENTER è di non fare nulla, ma segnale acustico.

Ho una sottoclasse la procedura di finestra per il controllo di modifica per ignorare il comportamento predefinito utilizzando il seguente codice:


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 );
}

In questo modo il comportamento equivale a premere il pulsante 'OK'.

Ora per il problema a portata di mano: questa procedura finestra non ignorare il comportamento predefinito di fare un beep. Ho il sospetto che ci deve essere qualche altro messaggio o messaggi che vengono attivati ??da enter che non riesco a catturare; Non riesco proprio a capire quale. Ho molta voglia di impedire al dispositivo di segnale acustico come scombina altri suoni che vengono riprodotti in determinate circostanze, quando si verifica una collisione oggetto, ed è fondamentale che l'utente viene avvisato di questo.

Grazie in anticipo.

È stato utile?

Soluzione

Dopo vomitando tutti messaggi ad un file di log, sono finalmente riuscito a capire quale messaggio è stato la causa del segnale acustico - WM_CHAR con set wParam a VK_RETURN. Fermare il messaggio vengano inoltrati al controllo di modifica fermato il segnale acustico. ^^

Il codice finale recita ora:


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 );
}

Altri suggerimenti

Ho avuto lo stesso problema, ma con il mio Rich Edit (utilizzando callback anche sottoclasse). Questo lato mi ha aiutato molto, ma purtroppo la soluzione da Gablin non ha funzionato per me. In qualche modo non ho potuto ottenere il VK_RETURN dal WM_CHAR. Ma dal messaggio WM_KEYDOWN posso :). Ho anche scoperto che nel mio caso il segnale acustico viene solo se l'uso ricco di modifica non lo stile ES_MULTILINE. Così finalmente questa è la mia soluzione di lavoro nella richiamata per Dissable il segnale acustico se si preme il tasto di ritorno. Forse può ancora aiutare qualcuno che ha lo stesso 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;
}

avuto lo stesso problema, ma grazie a voi, sono finalmente riuscito a disattivare il segnale acustico.

// 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);
}

Credo che il trucco è stato quello di non lasciare che eseguire queste due affermazioni

Prova anche la gestione della WM_KEYUP e tornare 0 per VK_RETURN anche lì -. Di Windows CE non emette un segnale acustico anche se non si gestisce l'evento chiave sia in basso e in alto

In un'applicazione desktop di Windows, mi è stato anche sempre emette un segnale acustico fastidioso quando colpisce il tasto freccia sinistra quando il punto di inserimento è stato quello di sinistra del primo carattere, o premendo il tasto freccia a destra quando il punto di inserimento è stato posizionato dopo l'ultimo carattere . maniglie Questo codice il tasto di ritorno, così come i tasti freccia destra e sinistra per fermare il segnale acustico.

Questo è in un'applicazione desktop di Windows, quindi non sto sentendo un segnale acustico per WM_CHAR + VK_RETURN; dovrete provare questo codice da soli su CE per vedere se funziona bene per voi.

    bool processKeystroke = true;

    if (message == WM_CHAR || message == WM_KEYDOWN || message == WM_KEYUP) {

        DWORD start = 0;
        DWORD end = 0;
        switch (wParam) {

        case VK_RETURN:
            if ((GetWindowLong(hwnd, GWL_STYLE) & ~ES_MULTILINE)) {
                processKeystroke = false;
            }
            break;
        case VK_LEFT:
            {
                ::SendMessage(hwnd, EM_GETSEL, (WPARAM) &start, (LPARAM) &end);
                if (start == 0 && end == 0) {
                    processKeystroke = false;
                }
            }
            break;
        case VK_RIGHT:
            {
                LPARAM charCount = ::SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
                ::SendMessage(hwnd, EM_GETSEL, (WPARAM) &start, (LPARAM) &end);
                if (wParam == VK_RIGHT && start == charCount && end == charCount) {
                    processKeystroke = false;
                }
            }
            break;
        }

        if (processKeystroke) {
            lResult = DefSubclassProc(hwnd, message, wParam, lParam);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top