WinApi skróty klawiszowe

0

Witam, robie w miare prosty komunikator Lanowy w WinApi, i moje pytanie czy da się zrobić tak by przypisać buttonowi "wyślij" skrót sklawiszowy Enter, oraz żeby ten enter nie był już wczytany do kontrolki w której jest wpisywany text?, dobrze by było żeby program sprawdzał jeszcze czy nie jest przytrzymany klawisz shift (wtedy "enter" został by wpisany do kontrolki, a wiadomość nie wysłana).

0

Możesz "filtrować" komunikaty zanim trafią do kontrolek. Wewnątrz pętli komunikatów, po pobraniu komunikaty (GetMessage/PeekMessage), sprawdź, czy to naciśnięcie ENTER'a. Jeśli tak to nie wysyłaj go do okna (DispatchMessage) tylko wykonaj interesującą cię akcję (zapewne wysłanie wiadomości). Możesz to zrobić przez TranslateAccelerator (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645526%28v=vs.85%29.aspx). Jeśli nie będziesz używać "Keyboard Accelerators" to SHIFT'a sprawdzisz funkcją GetKeyState/GetAsyncKeyState.

0

Zrobiłem tak:

 while (GetMessage (&Komunikat, NULL, 0, 0))
 {
       if(Komunikat.message==WM_SYSKEYDOWN and Komunikat.wParam==VK_RETURN){ // dalsze funkcje.  }
 

ale woogule mi warunek nie chce ruszyć naciskam enter i nic ;

0

Ja mam doświadczenie tylko pod WinAPI w Delphi, więc odpiszę, chociaż radzę Tobie przede wszystkim korzystać ze sprawdzania pisowni lub słownika przed napisaniem czegokolwiek w Internecie, bo pisząć "w ogóle" delikatnie mówiąć to się kompromitujesz. Poprzednik pisał o głownej procedurze obsługi komunikatów. Czyli robiśz coś w tym stylu (przełóż to sobie na C podobny język):

function MainDlgProc(AHWnd : HWND; Msg : UINT; wParam : wParam; lParam : lParam) : BOOL; stdcall;
  case Msg of
//...
    WM_KEYDOWN :
      begin
        if wParam = VK_ESCAPE then
        begin
          SendMessage(HiddenDialogHandle, WM_CLOSE, 0, 0);
        end;
        if (GetFocus = hCtlUserEdit) and (wParam = VK_RETURN) then
        begin
          SendMessage(MainDialogHandle, WM_COMMAND, IDC_GENERATEKEYBUTTON, 0);
        end;
      end;
//...
0

Możesz stworzyć sobie accelerator: http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Akceleratory/334
Jest do tego osobna pętla komunikatu i możesz sobie przypisać odpowiednią reakcję do kombinacji przycisków.

Tradycyjną metodą po prostu wykryj zdarzenie wciśnięcia przycisku. Tu masz wszystko opisane.
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Obsluga-myszy-i-klawiatury/179
Żywcem ściągnięte ze stronki powyżej:

case WM_KEYDOWN:
{
    switch(( int ) wParam )
    {
    case VK_RETURN:
        MessageBox( hwnd, "Wciśnięto Entera", "Yeah", MB_ICONINFORMATION );
        break;
       
    case VK_ESCAPE:
        DestroyWindow( hwnd );
        break;
    }
}
break;

Komunikat WM_KEYDOWN jest wysyłany za każdym razem, kiedy wciskasz jakiś przycisk.
Komunikat WM_KEYUP jest wysylany kiedy zwalniasz przycisk.
Jak chcesz na przykład wykryć wcisnięcie Shift+enter:

bool enter, shift;
case WM_KEYDOWN:
      switch(( int ) wParam )
      {
      case VK_RETURN:
         enter = true;
         break;
      case VK_SHIFT:
         shift = true;
         break;
      }
      if(shift == true && enter == true)
      {
      //to co tu wpiszesz stanie jak wciśniesz jednocześnie shift+enter
      }
      break;
case WM_KEYUP:
      switch(( int ) wParam )
      {
      case VK_RETURN:
         enter = false;
         break;
      case VK_SHIFT:
         shift = false;
         break;
      }    
      break;
0

Ok, Dzięki za pomoc, wykonałem to a pomocą akceleratorów, działa tak jak chciałem;

0

Nie działało bo zamiast WM_SYSKEYDOWN musisz przechwycić WM_KEYDOWN. Jeśli nie interesuje cię więcej akceleratów, a tylko ten jeden klawisz ENTER, to raczej pozostałbym przy zwykłym if'ie:

if(Komunikat.message==WM_KEYDOWN and Komunikat.wParam==VK_RETURN and GetKeyState(VK_SHIFT)<0)

1 użytkowników online, w tym zalogowanych: 0, gości: 1