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).
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.
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 ;
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;
//...
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;
Ok, Dzięki za pomoc, wykonałem to a pomocą akceleratorów, działa tak jak chciałem;
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)