2011-01-21 3 views
0

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

[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

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

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

Вот SendInput wrapper Я нашел googling.

+0

спасибо за ваш повтор. Я нашел подход с [DllImport ("user32.dll")] public static extern void keybd_event (byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); –

2

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

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

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

+0

+1 для SendKeys. Конечно, в предыдущем вопросе OP ему было рекомендовано не использовать SendKeys, а вместо этого просто использовать SendMessage, чтобы вытолкнуть текст непосредственно в поле редактирования, предположительно с помощью WM_SETTEXT. Но ОП, похоже, неправильно понял это ... –

+0

Yup, не хороший совет. Правильный ответ на это отправляет WM_COPY. –

Смежные вопросы