Отправленные сообщения и отправленные сообщения принимают совершенно разные маршруты. Цель получает ваше опубликованное сообщение, просто фильтрует или отправляет его в другое окно. Он делает то, что хочет с ним. Когда вы отправляете сообщения, они переходят непосредственно к оконной процедуре без фильтрации, поэтому, скорее всего, причина этой проблемы.
Я не знаю, почему работает HWND_BROADCAST; мое лучшее предположение состоит в том, что окно, отличное от Target, обрабатывает сообщение. Или, может быть, его даже отправляют в другое окно, чем Target. (Вы понимаете, что HWND_BROADCAST отправляет сообщения в каждое окно верхнего уровня)
Существует функция API Win32, предназначенная для отправки ввода, SendInput () , которая помещает сообщения в очередь ввода точно так же, как пользовательское нажатие клавиши. Однако это не позволяет вам указать окно, оно отправляет свои данные в активное окно. Чтобы использовать его, вам нужно будет активировать и переключить фокус на Target, что означает, что пользователь увидит, как это окно переместится наверх (так же, как вы нажимаете Alt-Tab). По тому же маршруту VBScript имеет функцию SendKeys () , которая делает то же самое, но проще в использовании.
В качестве окончательной альтернативы вы можете использовать SendMessageCallback () , который даст вам поведение асинхронного SendMessage, которое, как я полагаю, вы хотите. (И отличается от PostMessage. Отправленные сообщения попадают в очередь отправленных сообщений, отправленные сообщения доставляются напрямую)