Keyboard buffer
3 отговора
173 прегледа
Keyboard buffer
Niakoi moje li da mi kaje kak moga da izchistia klaviaturnia bufer vav win32 prilojenie?
Mersi predvaritelno.
Mersi predvaritelno.
Re: Keyboard buffer
Messages от клавиатурата се пазят в опашката асоциирана към прозореца (hWnd) който те интересува. Те са WM_CHAR, WM_KEYDOWN, WM_KEYUP и WM_SYSCOMMAND. Можеш да почистиш опашката, естествено, с API функцията
//
Остава да помислиш само от къде и в кой момент да я извикваш.
Заради това трябва да го разбираш.
Зависи от модела на програмата ти.
Обикновенно тези Messages се четат (и филтрират) в твоето приложение асинхронно от така наречения "Message Loop" чрез PeekMessage/TranslateMessage, връщат се на Windows чрез DispachMessage след което отново ги получаваш в съответната WindowProc асоциирана с прозореца ти. Например WM_CHAR никога не се получава в "Message Loop" ами след като Windows получи WM_KEYDOWN от TranslateMessage го генерира отделно и го праща на hWnd.
При MFC не е просто, понеже ако вече са тръгнали към MESSAGE_MAP, ... иди ги гони! Може би най-сигурно (за случая) е да overwrite-неш CWnd::PreTranslateMessage и просто да ги стопираш/пускаш в желан от теб момент - така знаеш че като си ги спрял няма да ги получиш без ти да пожелаеш.
BOOL PeekMessage(
LPMSG lpMsg, // message information
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax, // last message
UINT wRemoveMsg // removal options
);
//
Остава да помислиш само от къде и в кой момент да я извикваш.
Заради това трябва да го разбираш.
Зависи от модела на програмата ти.
Обикновенно тези Messages се четат (и филтрират) в твоето приложение асинхронно от така наречения "Message Loop" чрез PeekMessage/TranslateMessage, връщат се на Windows чрез DispachMessage след което отново ги получаваш в съответната WindowProc асоциирана с прозореца ти. Например WM_CHAR никога не се получава в "Message Loop" ами след като Windows получи WM_KEYDOWN от TranslateMessage го генерира отделно и го праща на hWnd.
При MFC не е просто, понеже ако вече са тръгнали към MESSAGE_MAP, ... иди ги гони! Може би най-сигурно (за случая) е да overwrite-неш CWnd::PreTranslateMessage и просто да ги стопираш/пускаш в желан от теб момент - така знаеш че като си ги спрял няма да ги получиш без ти да пожелаеш.
Re: Keyboard buffer
за конзолно приложение - FlushConsoleInputBuffer()
поздрав на съименника по ник отговорил за GUI приложение. :)
поздрав на съименника по ник отговорил за GUI приложение. :)
Re: Keyboard buffer
Mersi za dosta podrobnata informacia. Vsashtnost me interesuvashe MFC. Ideiata e che iskam na OnSetFocus() da izchistia WM_KEYUP, poneje poniakoga ostava po niakoi paraziten klavish koito mnogo mi barka rabotata. Az veche sam si reshil problema po drug nachin (chakam natiskane + otpuskane, a ne samo otpuskane), no shte probvam PeekMessage() - dalech po chisto shte stane.
10x
10x