2013-09-06 2 views
1

Мне нужно удалить все сообщения, связанные с клавиатурой, из очереди сообщений в потоке. После некоторых исследований мне удалось написать следующий код:Windows - Удаление сообщений, связанных с клавиатурой из очереди сообщений

for(MSG zMsg; PeekMessage(& zMsg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE);); 

Но он не работает.

Я не знаю, является ли это хорошей практикой или нет, но у меня нет возможности и времени, чтобы переписать код, над которым я работаю, чтобы сделать его более чистым.

Как я могу заставить этот код работать?

Благодарим за помощь!

EDIT: Я использую WindowsCE

+0

Почему вы думаете, что не работает? Мне это хорошо. –

+0

Потому что, как только я дойду до того, что произойдет, клавиши будут отправлены. Я добавил вызов :: MessageBox() в третьей части цикла for, чтобы убедиться, что он находит хотя бы одно сообщение, но всплывающее окно не появляется. Возможно, я использую неправильные фильтры? – Virus721

+0

Я думаю, что нашел причину. WindowsCE не обрабатывает значение по умолчанию (NULL) для параметра дескриптора окна. – Virus721

ответ

0

Я думаю, что вы все, кроме фильтрации сообщений клавиатуры.

wMsgFilterMin 

Значение первого сообщения в диапазоне сообщений, подлежащих рассмотрению.

wMsgFilterMax 

Значение последнего сообщения в диапазоне сообщений для проверки.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx

+0

' WM_KEYFIRST' - это сообщение с наименьшим значением, связанным с клавиатурой, и 'WM_KEYLAST' является самым высоким значением, связанным с клавиатурой. –

+0

Да, это то, что я хочу, выберите каждое сообщение клавиатуры, чтобы удалить его. – Virus721

+1

Peekmessage возвращает' false', если нет сообщения в очереди.Попробуйте 'while (1) {PeekMessage (& zMsg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE);}' – Prownage

Смежные вопросы