PostMessage для сообщений между приложениями - PullRequest
0 голосов
/ 12 сентября 2009

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

Однако, когда я переключил SendMessage на PostMessage, приложение больше не получало сообщения.

Однако я нашел обходной путь, используя HWND_BROADCAST в качестве дескриптора окна, и он отлично работает, но не идеальный способ сделать это.

То, что я спрашиваю, у меня есть действующий hWnd, как я могу отправлять ему сообщения, используя PostMessage, а не SendMessage?

Редактировать Это то, что я пытаюсь сделать.

HWND Target = FindWindow(0, "Window Title Goes Here");
LPARAM lParam = (1 | (57<<16)); // OEM Code and Repeat for WM_KEYDOWN
WPARAM wParam = VK_SPACE;
PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); // Works
PostMessage(Target, WM_KEYDOWN, wParam, lParam); // Doesn't Work
SendMessage(Target, WM_KEYDOWN, wParam, lParam); // Works, but I need Post

Ответы [ 3 ]

1 голос
/ 12 сентября 2009

Функция PostMessage не работает, когда сообщения имеют номера от 0 до WM_USER -1. Используйте RegisterWindowMessage для регистрации ваших собственных сообщений.

0 голосов
/ 21 июля 2014

* Для lparam перейдите сюда http://msdn.microsoft.com/en-us/library/ms646280%28v=vs.85%29.aspx, измените 32 бита (31 ... 3 2 1 0) lParam. Получив двоичное предложение для параметров (cRepeat, Scancode и т. Д.), Преобразуйте его в шестнадцатеричное.

попробуйте это:

void SendString(HWND h, char *text)
{
   int len = strlen(text);
   for(int i = 0; i < len; i++)
   PostMessage(h, WM_CHAR, text[i], 0);
}



HWND Target = FindWindow(0, "Window Title Goes Here");
LPARAM lParam = //The hexadecimal value matching with the parameters you want* example 0x29A1. 
WPARAM wParam = VK_SPACE;
PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); 
PostMessage(Target, WM_KEYDOWN, wParam, lParam); 
SendString(Target, (char*)"themessageyouwant\n"); 
0 голосов
/ 12 сентября 2009

Отправленные сообщения и отправленные сообщения принимают совершенно разные маршруты. Цель получает ваше опубликованное сообщение, просто фильтрует или отправляет его в другое окно. Он делает то, что хочет с ним. Когда вы отправляете сообщения, они переходят непосредственно к оконной процедуре без фильтрации, поэтому, скорее всего, причина этой проблемы.

Я не знаю, почему работает HWND_BROADCAST; мое лучшее предположение состоит в том, что окно, отличное от Target, обрабатывает сообщение. Или, может быть, его даже отправляют в другое окно, чем Target. (Вы понимаете, что HWND_BROADCAST отправляет сообщения в каждое окно верхнего уровня)

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

В качестве окончательной альтернативы вы можете использовать SendMessageCallback () , который даст вам поведение асинхронного SendMessage, которое, как я полагаю, вы хотите. (И отличается от PostMessage. Отправленные сообщения попадают в очередь отправленных сообщений, отправленные сообщения доставляются напрямую)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...