c # PostMessage не отправляется и без ошибок - PullRequest
2 голосов
/ 27 ноября 2010

Во-первых, я пытаюсь отправить ввод с клавиатуры в фоновое приложение (окно, которое не имеет фокуса или может даже не отображаться для пользователя).

Я подтвердил, чтоwinHandle и константы верны.Проблема в том, что фоновое приложение, похоже, не получает сообщение, UNLESS, я установил точку останова в строке PostMessage (), и нажимаю F10 (шаг) или F5 (Продолжить), когда он туда попадает, затем волшебное нажатие клавиши отправляется.

Что дает?Соответствующий код:

    [DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
    public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    PostMessage(winHandle, (uint)WM_KEYDOWN, 66, 0);

Использование Win7 64 и MS Visual studio 2008 pro, Консольное приложение.И приведенный выше код находится в потоке, если это помогает.

1 Ответ

2 голосов
/ 27 ноября 2010

Использование Win7 64

Это несколько актуально, декларация неверна.Работает в 32-битном режиме, но хлопотно в 64-битном режиме.Последние два аргумента являются указателями, а не целыми числами.8 байт, а не 4. Исправление:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

PostMessage(winHandle, (uint)WM_KEYDOWN, (IntPtr)66, IntPtr.Zero);

Однако это может не решить вашу проблему.В режиме x64 первые 4 аргумента метода, не являющегося экземпляром, передаются в регистрах, а не в стеке.Просто так получилось, что у этого метода 4 аргумента, вы не получите предупреждение PInvokeStackImbalance MDA.А старшие 32-битные значения 64-битных регистров часто равны нулю, поэтому не имеет значения, генерирует ли маршаллер P / Invoke 32-битное или 64-битное значение аргумента.что такой подход довольно проблематично на практике.Вы не можете контролировать состояние клавиатуры в целевом процессе.Вы посылаете нажатие клавиши для B. Это может превратиться в B, b, Alt + B или Ctrl + B, в зависимости от состояния клавиш-модификаторов.Только SendInput () может работать надежно.Ну, вкратце из окна проблема с фокусом.

...