2011-01-02 7 views
5

Zasadniczo chcę nacisnąć Enter, aby wywołać komunikat, który mogę złapać, gdy fokus kontroli jest ustawiony na ostrość i naciśnięcie klawisza użytkownika. Wszystkie rozwiązania online wydają się dotyczyć podklasowania, ale zastanawiałem się, czy istnieje inny sposób obejścia tego problemu?win32 C++ wykrywanie "enter" w kontroli edycji z podklasą?

Na przykład mój przycisk ma identyfikator ID_BUTTON_SEND. Oto, jak to sobie wyobrażam;

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

... masz pomysł :) Czytałam opcję http://support.microsoft.com/kb/102589 ale szczerze 1 dosn't sensu do mnie.

Cheers

Odpowiedz

3

Najlepszy sposób, aby złapać to przed TranslateMessage zostanie wywołany. Tak więc, jeśli używasz MFC, zmień CWnd :: PreTranslateMessage. Jeśli korzystasz tylko z interfejsu API Win, to po prostu sprawdź w swojej wiadomości pompę, co zawiera wiadomość przed wywołaniem funkcji TranslateMessage.

+0

Jaką wiadomość mam szukać? WM_CHAR, WM_KEYPRESS czy coś? Ponadto - czy ma to wpływ na wydajność, czy robi to za każdym razem, gdy otrzyma wiadomość? – KaiserJohaan

+0

Nie martw się o problemy z wydajnością, są one pomijalne. Jednak zapomniałem o jakiej wiadomości szukać :), ale ponieważ nie został jeszcze tranaslowany, myślę, że to WM_KEYDOWN będzie tą, której należy szukać. (lub WM_KEYUP również). – kellogs

3

Można uwięzić zdarzenie zmiany ogniskowej, a gdy formant edycji otrzyma zdarzenie fokusowe, wystarczy zmienić domyślny przycisk okna, aby był przyciskiem * ID_BUTTON_SEND *. Następnie, gdy ostrość zostanie utracona, usuń tę domyślną flagę przycisku.

Oznacza to, że za każdym razem, gdy użytkownik wejdzie, gdy formant edycji będzie miał fouki, okno dialogowe automatycznie uruchomi domyślny przycisk * ID_BUTTON_SEND *.

Można zrobić przycisk przycisk domyślny dodając BS_DEFPUSHBUTTON do GWL_STYLE przycisku.

2

Wystarczy powtórzyć w artykule KB. Dla opcji 1 można po prostu obsługiwać IDOK w WM_COMMAND.

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

To znacznie łatwiejszy i czystszy sposób sprawdzenia Enter.

+0

Dziękujemy! Próbowałem to wytropić przez kilka dni. Do OP można sprawdzić HWND kontrolki, tak jak w twoim lparamie. –