SendMessage не работает из C # - PullRequest
0 голосов
/ 21 января 2011

Я пытаюсь напечатать букву «а» в активном окне из моего приложения:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

...

// global hotkey handler
void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
    var hWnd = GetForegroundWindow();

    SendMessage(hWnd, (uint)WM.KEYDOWN, (int)VK.KEY_A, 0);
    SendMessage(hWnd, (uint)WM.KEYUP, (int)VK.KEY_A, 0);
 }

Но буква не появляется в активном окне (для любого приложения). Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Вы должны использовать PostMessage, а не SendMessage. Ваше объявление pinvoke также неверно, возвращаемое значение и последние 2 аргумента IntPtr, а не int.

Конечным недостатком является то, что вы не можете контролировать состояние клавиш-модификаторов, Ctrl, Shift и Alt. Это приводит к случайному сбою в зависимости от того, нажата ли у пользователя одна из этих клавиш. Требуется SendInput, заставляя вас теперь также правильно установить фокус с помощью SetForegroundWindow (). Используйте SendKeys в приложении Winforms.

Чтобы ввести ключи ввода, вы можете использовать SendMessage () для отправки WM_CHAR.

2 голосов
/ 21 января 2011

Отправка WM_KEYDOWN и WM_KEYUP не работает, особенно для символьных клавиш.Насос сообщений приложения вызывает TranslateMessage, который генерирует WM_CHAR для этих ключей.Обычно это WM_CHAR, на который приложение обращает внимание на ввод символов.

Правильный способ ввода ввода - использовать функцию SendInput .

Обертка Я нашел, погуглив.

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