Здравствуйте, 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, который иногда предотвращает зависание.