Autor Wątek: Problem z Messagebox  (Przeczytany 1792 razy)

Offline Ed

  • Użytkownik

# Styczeń 21, 2007, 15:30:51
Witam !

Niedawno napisałem sobie taki prosty modulik klawiatury. I mam pewien dziwny problem. Wszystko działa ok ale gdy wywołam MessageBoxa() to zeby ponownie go wyswietlic trzeba 2 razy ten sam klaiwsz nacisnac np. :

if(klawisze.keyPressed(VK_ENTER))
{
::MessageBox(NULL,"test", "test", MB_ICONINFORMATION);
}

Normalnie wszystko jest ok ale teraz gdy wyswietli sie msgbox to musze dwa razy nacisnac ENTER zeby ponownie sie wyswietlil. Inne klawisze dzialaja ok, ale 'bolokuje' sie zawsze ten ktorym probuje wywolac messageboxa. Nie wiem w ogole czemu tak jest niemoge nigdzie znalesc bledu.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 21, 2007, 15:46:39
Najprawdopodobniej masz coś nie tak z obsługą klawiatury i błąd nie jest w kodzie, który pokazałeś.

Zgaduję, że dzieje się coś takiego:
- user wciska klawisz,
- dostajesz WM_KEYDOWN, stan=wciśnięty,
- otwierasz MessageBox'a,
- user puszcza klawisz,
- NIE dostajesz WM_KEYUP, bo okno Twojego programu nie jest na wierzchu,
- user zamyka MessageBox'a,
- user wciska klawisz jeszcze raz,
- dostajesz WM_KEYDOWN, ale go ignorujesz, bo stan=wciśnięty,
- user puszcza klawisz
- dostajesz WM_KEYUP, stan=zwolniony, teraz wszystko wraca do normy


Oczywiście wszystko może się nieco inaczej odbywać, ale to jest taki mój strzał w ciemno w prawdopodobną odpowiedź. :)

Offline Ed

  • Użytkownik

# Styczeń 21, 2007, 15:58:57
he  :) że wcześniej na to nie wpadłem  ;D A jak sprawdzić czy okno jest aktywne/dezaktywne ? bo WM_ACTIVE to działa w przypadku schowania na pasek, chociaz w winuser.h znalazlem  jeszcze cos takiego :

/*
 * WM_ACTIVATE state values
 */
#define     WA_INACTIVE     0
#define     WA_ACTIVE       1
#define     WA_CLICKACTIVE  2
Czy tym mozna jakos sprawdzic czy okno jest aktywne ?

Offline Xion

  • Redaktor
    • xion.log

# Styczeń 21, 2007, 16:05:36
Jeżeli chodzi o to, które okienko ma aktualnie fokus klawiatury (zwykle to rozumie się pod potocznym określeniem "aktywne"), to służy do tego funkcja GetFocus().

A tutaj raczej bym pomyślał nad użyciem Get(Async)KeyState(), choć zależy to oczywiście od rodzaju aplikacji.

Offline Ed

  • Użytkownik

# Styczeń 21, 2007, 19:11:19
Nie bardzo wiem jak to użyć. Bo skoro miałbym używać GetKeyStates() to chyba niema sensu sprawdzać stanu klawiszy w WM_KEYDOWN i WM_KEYUP ? Jak jest lepiej / wydajniej ?

Offline Xion

  • Redaktor
    • xion.log

# Styczeń 21, 2007, 22:48:55
W grze i tak masz pętlę renderującą, więc nie odbierasz stanu klawiszy przez komunikaty Windowsa, tylko używasz wspomnianych funkcji (albo bardziej wyspecjalizowanych narzędzi jak DirectInput). W przypadku programów użytkowych używa się komunikatów, oczywiście.