2010-08-27 19 views
5

Ich entwickle eine Anwendung für ein POCKET PC 2003 (Windows CE 4.2) Gerät mit C++ und native WINAPI (d. H. Kein MFC oder dergleichen). Darin habe ich ein einzeiliges Edit Control welches Teil des Hauptfensters (nicht ein Dialog); daher ist das normale Verhalten von Windows beim Drücken von ENTER nichts anderes als ein Signalton.Wie wird der Piepton ausgeschaltet, wenn ENTER bei einer einzeiligen EDIT-Steuerung unter Windows CE gedrückt wird?

Ich habe die Fensterprozedur für das Bearbeitungssteuer subclassed das Standardverhalten mit dem folgenden 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 bewirkt, dass das entsprechende Verhalten wie das Drücken der Taste ‚OK‘.

Nun zum Problem: Diese Fensterprozedur überschreibt nicht das Standardverhalten eines Pieptons. Ich vermute, dass es andere Nachrichten oder Nachrichten geben muss, die ausgelöst werden, wenn ENTER gedrückt wird, die ich nicht erfassen kann; Ich kann einfach nicht herausfinden, was. Ich möchte wirklich verhindern, dass das Gerät piepst, da es andere Sounds durcheinander bringt, die unter bestimmten Umständen abgespielt werden, wenn eine Objektkollision auftritt, und es ist wichtig, dass der Benutzer darüber informiert wird.

Vielen Dank im Voraus.

+0

Ich weiß nicht, ob dies für Windows CE als auch wahr ist, aber mit dem Desktop von Windows Sie Tastaturnavigation in einem Standardfenster erhalten durch den Aufruf [IsDialogMessage ] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645498.aspx) als Teil des Nachrichtenversands. Dies betrifft unter anderem auch die [Enter] -Taste und ruft die Standardschaltfläche auf (falls vorhanden). – IInspectable

Antwort

11

Nach spuckt alle Meldungen in eine Protokolldatei, ich es endlich geschafft, um herauszufinden, welche Nachricht die Piepsen verursacht wurde - WM_CHAR mit wParam Satz VK_RETURN. Wenn Sie verhindern, dass diese Nachricht an das Bearbeitungssteuerelement weitergeleitet wird, wurde das Piepen beendet. ^^

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

Versuchen Sie auch, das WM_KEYUP zu behandeln und geben Sie dort auch 0 für VK_RETURN zurück - Windows non-CE piept auch, wenn Sie das Schlüsselereignis nicht sowohl nach unten als auch nach oben behandeln.

+0

Nein, hat nicht funktioniert. Immer noch piepend. – gablin

+0

... WM_CHAR - oh - wie viel muss man handhaben, um einen Piepton zu stoppen! :) –

+0

Anscheinend nur diese Nachricht. ^^ – gablin

0

das gleiche Problem hatte, aber dank dir, ich es endlich geschafft, den Signalton auszuschalten.

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

Ich denke, der Trick, diese beiden Aussagen

2

ich hatte das gleiche Problem, aber mit meiner Rich Edit (auch mit subclassed Rückruf) ausführen, um nicht zulassen war. Diese Seite hat mir sehr geholfen, aber die Lösung von Gablin hat leider nicht funktioniert. Irgendwie konnte ich den VK_RETURN nicht vom WM_CHAR bekommen. Aber von der WM_KEYDOWN Nachricht kann ich :). Ich fand auch heraus, dass in meinem Fall der Signalton nur dann kommt, wenn der Rich-Edit nicht den ES_MULTILINE-Style verwendet. Also ist dies meine funktionierende Lösung im Callback, um den Signalton zu deaktivieren, wenn die Return-Taste gedrückt wird. Vielleicht kann es immer noch jemanden 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)){ //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; 
}