PostMessage WM_KEYDOWN отправить ключи умножения? - PullRequest
1 голос
/ 12 октября 2011

У меня есть этот код:

    public static void Next()
    {
        Process[] processes = Process.GetProcessesByName("test");

        foreach (Process proc in processes)
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
    }

Этот код отправляет правую клавишу со стрелкой, я хочу отправить ALT + CTRL + RIGHT, я пробовал это:не работает ...

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Вы не можете смоделировать ввод с клавиатуры с PostMessage , по крайней мере, ненадежно использовать SendInput вместо.

1 голос
/ 12 октября 2011

Я пробовал это так много раз, и он ударил или пропустил, если это работает.Что вы хотите сделать, это попытаться использовать WM_SYSKEYDOWN вместо WM_KEYDOWN для ключей «системного» типа.Это также означает, что вы должны использовать WM_SYSKEYUP.Примерно так может работать:

PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_CONTROL, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_ALT, 0); 
PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_ALT, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_CONTROL, 0); 

Обновление:

Имеется только симуляция нажатий клавиш для отдельных клавиш, отлично работает даже для свернутых приложений :).При использовании его в качестве комбинированной клавиши для состояний «сдвиг», это место, где оно попадает или отсутствует.Проблема в том, что большинство оконных приложений имеют элемент управления, и каждый элемент управления имеет свой дескриптор, поэтому отправка ключа в окно не имеет желаемого эффекта, вы должны отправить ALT + S на дескриптор «Menu», чтобы сохранить файл (скажем, в блокноте), который тоже работает.

...