Problem z obsluga klawiatury

0

Witam. Mam nastepujacy problem. Napisalem program/gre w Visual C++, lecz jeden szkopul nie daje mi zyc. Mianowicie jest to odbieranie widomosci z okna. Uzywam funkcji PeekMessage(...), zeby nie blokowac programu, lecz gdy dziala on jakis czas i uzytkownik bez przerwy korzysta z klawiatury, okno nie nadarza z odbieraniem wiadomosci. Zostaja one kolejkowane i odbierane kiedy zaden klawisz nie jest juz wcisniety. Nie wiem jak to zmienic. Pomocy. Fragment urzytego kodu:

(...)
bool key[256];

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
(...)
case WM_KEYDOWN:
{
key[wParam]=TRUE;
return 0;
}
case WM_KEYUP:
{
key[wParam]=FALSE;
return 0;
}
(...)
}

(...)

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmhLine,int nShowCmd)
{
MSG msg;
while(!GetAsyncKeyState(VK_ESCAPE))
{
PeekMessage(&msg,hWnd,0,0,PM_REMOVE);

	TranslateMessage(&msg);
	DispatchMessage(&msg);
	(...)
}
(...)

}

0

zakladam, ze kazdy klawisz zostanie kiedys zwolniony, wiec nie bedziemy notowac tego faktu.

#define BUFSIZE 256
WPARAM keybuf[BUFSIZE];
int bufstart=0,bufend=0;


WPARAM getkey(){
  WPARAM ret=0;
  if(bufstart^bufend){
    ret=keybuf[bufstart];
    (++bufstart)%=BUFSIZE;
  }
  return ret;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
  switch(msg){
    case WM_KEYDOWN:{
      if(bufstart^bufend){  // if(bufstart!=bufend)
        keybuf[bufend]=wParam;
        (++bufend)%=BUFSIZE; // bufend=(bufend+1)%BUFSIZE;
      }/*else long_nasty_beep_for_example()*/
      return 0;
    }
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmhLine,int nShowCmd){
  MSG msg;
  while(!GetAsyncKeyState(VK_ESCAPE)){
     PeekMessage(&msg,hWnd,0,0,PM_REMOVE);
     TranslateMessage(&msg);
     DispatchMessage(&msg);     
   }
}

// jak odebrac wszystkie znaki z bufora na raz ?

WPARAM klawisz;
while(klawisz=getkey()){
  zrob_cos_z_tym_klawiszem(klawisz);
}

nie jest ci potrzebne zapalanie znacznikow, tylko zbieranie klawiszy. bufor bedzie sie zapelnial z szybkoscia jaka jest ustawiona w systemie (tak sie mnie wydaje :] )

0

Tak. Tyko jezeli bede chcial odczytac czy w danym momencie wduszony jest klawisz 'W' i klawisz np. 'P' to przydalaby sie tablica przechowujaca dane o tym czy dany klawisz jest "aktywny", a wlasnie o to mi chodzi. Czyli reasumujac: Ptrzebuje wiedziec czy "jakis" klawisz jest wcisniety, ale zeby wiadomosci nie tworzyly kolejki.

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