Re: WM_KEYDOWN на две клавиши
От: Alexmoon Украина  
Дата: 21.06.03 05:50
Оценка:
Здравствуйте, Andrew__S, Вы писали:

A__>Здравствуйте.

A__>Приношу свои извинения за повтор вопроса. Но поиск так и не помог.
A__>Есть многооконная программа (это, наверное, не важно). В одно из ее
A__>окон надо послать комбинацию клавиш с CTRL. Т.е., например, CTRL+B.
A__>Пишу (в C++ Builder-е):

A__>
A__>SendMessage(hWnd,WM_KEYDOWN, VK_CONTROL, 0);
A__>SendMessage(hWnd,WM_KEYDOWN, 0x42, 0);
A__>SendMessage(hWnd,WM_KEYUP...
A__>SendMessage(hWnd,WM_KEYUP...
A__>


A__>CTRL не удерживается...

A__>Да, и 0 как LPARAM не работает, хотя везде в примерах (в т.ч. здесь) — 0.

Ноги растут именно от того, что ты на LPARAM внимания не обращаешь. Ведь он содержит
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.
Я так понял, что обработчик у того окна твой собственный. Возьми и поставь в WM_KEYDOWN точку прерывания, но не на входе, а то ты комбинацию так и не отловишь, а с проверкой того бита в скан коде, который сигнализирует о нажатых extended key. И на всякий случай, чтобы уж точно быть уверенным, если это тоже обрабатывается соответствующим образом, то и WM_KEYUP. Исделай соответствующие вызовы:

SendMessage(hWnd, WM_KEYDOWN, 0x42, scan);
SendMessage(hWnd, WM_KEYUP, 0x42, scan); — если это необходимо, потому что если ты просто хочешь вызвать обработчик, то keydown достаточно.
Если ты хочешь смоделировать реальное нажатие клавиш, то это совсем другая история.

И не забывай о возможных последствиях работы SendMessage. Если тебе просто нужно поставить в очередь сообщение, то PostMessage тебе вполне достаточно и есть еще один схожый механизм SendMessageTimeout, который иногда предотвращает зависание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.