4 Stimmen

Wie deaktiviere ich das Piepen beim Drücken von ENTER auf einem einzeiligen EDIT-Steuerelement unter Windows CE?

Ich entwickle eine Anwendung für ein POCKET PC 2003 (Windows CE 4.2) Gerät mit C++ und nativem WINAPI (also kein MFC oder ähnliches). Darin habe ich eine Einzeilige Bearbeitungssteuerung, die Teil des Hauptfensters ist (nicht ein Dialog); daher ist das normale Verhalten von Windows beim Drücken von ENTER, nichts zu tun, sondern zu piepen.

Ich habe das Fensterverfahren für die Bearbeitungssteuerung untergeordnet, um das Standardverhalten mit folgendem Code zu überschreiben:

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

Dies führt zum gleichen Verhalten wie das Drücken der 'OK'-Schaltfläche.

Nun zum aktuellen Problem: Dieses Fensterverfahren überschreibt das Standardverhalten des Piepsens nicht. Ich vermute, dass es andere Nachrichten oder Nachrichten gibt, die ausgelöst werden, wenn ENTER gedrückt wird, die ich nicht erfassen kann; Ich kann einfach nicht herausfinden, welche. Ich möchte wirklich verhindern, dass das Gerät piept, da es andere Geräusche durcheinander bringt, die in bestimmten Situationen abgespielt werden, wenn eine Kollision mit einem Element auftritt, und es ist entscheidend, dass der Benutzer darüber informiert wird.

Vielen Dank im Voraus.

14voto

gablin Punkte 4580

Nachdem ich alle Nachrichten in eine Protokolldatei geschrieben hatte, gelang es mir endlich herauszufinden, welche Nachricht das Piepen verursachte - WM_CHAR mit wParam auf VK_RETURN gesetzt. Das Stoppen dieser Nachricht vom Weiterleiten an das Bearbeitungssteuerelement stoppte das Piepen. ^^

Der endgültige Code lautet nun:

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

2voto

roman Punkte 525

Hatte das gleiche Problem, aber dank dir konnte ich es endlich schaffen, den Piepton auszuschalten.

// Führen Sie die Nachrichtenschleife aus. Sie läuft, bis GetMessage() 0 zurückgibt
while(GetMessage (&messages, NULL, 0, 0)) {
  if(messages.message == WM_KEYDOWN && messages.wParam == VK_RETURN) {
    sendChatMessage("Beispieltext");
    continue;
  }

  // Übersetzen von Virtual-Key-Nachrichten in Zeichen-Nachrichten
  TranslateMessage(&messages);

  // Nachricht an WindowProcedure senden
  DispatchMessage(&messages);
}

Ich denke, der Trick bestand darin, diese beiden Anweisungen nicht ausführen zu lassen.

2voto

Bluefire Punkte 408

Ich hatte das gleiche Problem, aber mit meinem Rich Edit (auch unter Verwendung eines untergeordneten Rückrufs). Diese Seite hat mir sehr geholfen, aber leider hat die Lösung von gablin bei mir nicht funktioniert. Irgendwie konnte ich das VK_RETURN nicht aus der WM_CHAR-Nachricht abrufen. Aber aus der WM_KEYDOWN-Nachricht kann ich es :). Ich habe auch herausgefunden, dass in meinem Fall der Ton nur dann kommt, wenn der Rich Edit nicht den ES_MULTILINE-Stil verwendet. Also, dies ist schließlich meine funktionierende Lösung im Callback, um den Ton zu deaktivieren, wenn die Eingabetaste gedrückt wird. Vielleicht kann es immer noch jemandem helfen, der das gleiche Problem hat :)

switch (message){
        case (WM_KEYDOWN) : {
                switch (wParam) {
                case VK_RETURN:
                    if ((GetWindowLong(this_editbox->getHandle(), GWL_STYLE) & ~ES_MULTILINE)){ // Nur Eingabetaste deaktivieren, wenn der Rich Edit einzeilig ist
                        // Hier können Sie etwas tun, zum Beispiel den Text mit SetWindowTextA(hRichEdit, ""); löschen nach dem Lesen
                        return 0; // Ton stoppen, indem die Nachricht blockiert wird
                    }
                }
            break;
        }
        default: break;
}

0voto

Will A Punkte 24412

Versuchen Sie auch, das WM_KEYUP zu behandeln und geben Sie auch für VK_RETURN dort 0 zurück - Windows non-CE piepst auch, wenn Sie das Tastaturereignis sowohl in gedrücktem als auch in losgelassenem Zustand nicht behandeln.

0voto

Mark Coniglio Punkte 329

In einer Windows-Desktop-App erhielt ich auch lästige Pieptöne, wenn ich die linke Pfeiltaste drückte, wenn der Einfügepunkt links des ersten Zeichens lag, oder die rechte Pfeiltaste drückte, wenn der Einfügepunkt sich nach dem letzten Zeichen befand. Dieser Code behandelt die Eingabetaste sowie die linken und rechten Pfeiltasten, um den Ton zu stoppen.

Das ist in einer Windows-Desktop-App, daher höre ich keinen Ton für WM_CHAR + VK_RETURN; Sie müssen diesen Code selbst auf CE ausprobieren, um zu sehen, ob er gut für Sie funktioniert.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X