Использование User32.dll SendMessage для отправки ключей с модификатором ALT [дубликат]

Возможный дубликат:

C # и SendMessage (ключи) не работает

Я пишу приложение, которое отправляет нажатия клавиш в другое приложение, используя функцию SendMessage, определенную вuser32.dll, Я выяснил, как отправить одно нажатие клавиши, но я озадачен попыткой отправить нажатие клавиши вместе с клавишей ALT.

В целях моего вопроса я сосредоточусь на отправке F1 и ALT + F1.

Как указано выше, я могу отправить клавишу F1 без проблем. Вот фрагмент моего кода, который отправляет клавишу F1:

// DLL Imports

//Set the active window
[DllImport("user32.dll")]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);

//sends a windows message to the specified window
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);

// ...

// Some constants
#define WM_SYSKEYDOWN 260
#define WM_SYSKEYUP 261
#define WM_CHAR 258
#define WM_KEYDOWN 256
#define WM_KEYUP 257

// ...

// activate the window and send F1
SetActiveWindow(hWnd);
ushort action = (ushort)WM_SYSKEYDOWN;
ushort key = (ushort)System.Windows.Forms.Keys.F1;
SendMessage(hWnd, action, key, 0);

Одно интересное замечание: несмотря на то, что приведенный выше код работает при отправке ключа F1 целевому приложению, он не совпадает с тем, что я вижу при использовании Spy ++. Вот вывод журнала Spy ++ всякий раз, когда я нажимаю клавишу F1 во время мониторинга целевого приложения:

 00050412 P WM_KEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:0 fUp:0
 00050412 P WM_KEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Обратите внимание, что отправлено два сообщения: WM_KEYDOWN и WM_KEYUP.

Мой первый вопрос: почему я успешно отправляю F1 с помощью WM_SYSKEYDOWN, когда Spy ++ сообщает мне, что WM_KEYDOWN + WM_KEYUP - правильная последовательность сообщений?

Переходя к моей следующей задаче - попытаться отправить ALT + F1.

Я использовал Spy ++ для мониторинга сообщений, передаваемых при нажатии клавиш ALT + F1 на клавиатуре, и вот что я вижу:

 00050412 P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:1 fRepeat:0 fUp:0
 00050412 P WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:0 fUp:0
 00050412 P WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:1 fUp:1
 00050412 P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:0 fRepeat:1 fUp:1

Учитывая описанный выше захват сообщений Spy ++, я попытался отправить точную последовательность сообщений, используя следующий код (упрощенно):

SetActiveWindow(hWnd);    
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.Menu, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYUP, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_KEYUP, (ushort)System.Windows.Forms.Keys.Menu, 0);

Это не сработало.

И это приводит к моему следующему вопросу.Есть ли что-то еще, что я могу попробовать, или я что-то здесь не так делаю?

Всякий раз, когда я записывал выходные данные моей программы, используя Spy ++, вот что было зарегистрировано:

 00050412 S WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
 00050412 R WM_SYSKEYDOWN
 00050412 S WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
 00050412 R WM_SYSKEYDOWN
 00050412 S WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
 00050412 R WM_SYSKEYUP
 00050412 S WM_KEYUP nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
 00050412 R WM_KEYUP

Обратите внимание, что естьдополнительный сообщения отправляются в строках 2, 4, 6 и 8.Может ли это быть причиной того, что вещи не работают?

У меня есть последний вопрос относительно разницы между сообщениями, полученными с реального ввода с клавиатуры, и сообщениями, полученными с помощью моего приложения. Обратите внимание наcRepeat,скан,fExtended, так далее.аргументы, Они ненулевые в сообщениях, которые были захвачены с использованием моей клавиатуры в качестве ввода, и все они равны нулю в сообщениях, отправленных моим приложением.Может ли это быть причиной того, что мой код не работает? Если так, как я могу изменить эти значения? (Я предполагаю, что они исходят из 4-го аргумента функции SendMessage, которую я установил в ноль во всех случаях.)

Спасибо,

январь

Ответы на вопрос(2)

Ваш ответ на вопрос