Usando User32.dll SendMessage para enviar chaves com o modificador ALT [duplicado]

Duplicata Possível:
C # e SendMessage (keys) não está funcionando

Estou escrevendo um aplicativo que envia pressionamentos de tecla para outro aplicativo usando a função SendMessage definida emuser32.dll. Eu descobri como enviar um único toque de tecla, mas estou perplexo tentando enviar o pressionamento de tecla junto com a tecla ALT.

Para o propósito da minha pergunta, vou focar no envio de F1 e ALT + F1.

Como dito acima, eu posso enviar a tecla F1 sem problemas. Aqui está um trecho do meu código que envia a chave 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);

Uma observação interessante é que, embora o código acima funcione enviando a chave F1 para o aplicativo de destino, ele não é o mesmo que eu vejo usando o Spy ++. Aqui está a saída do log do Spy ++ sempre que eu pressiono a tecla F1 enquanto monito o aplicativo de destino:

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

Observe que há duas mensagens enviadas, WM_KEYDOWN e WM_KEYUP.

Minha primeira pergunta seria, por que eu sou bem sucedido enviando F1 usando WM_SYSKEYDOWN quando o Spy ++ me diz que WM_KEYDOWN + WM_KEYUP é a sequência de mensagens apropriada?

Passando para o próximo desafio de tentar enviar ALT + F1.

Eu usei o Spy ++ para monitorar as mensagens transmitidas ao pressionar ALT + F1 no meu teclado e é isso que eu vejo:

<00001> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:1 fRepeat:0 fUp:0
<00002> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00003> 00050412 P WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:1 fUp:1
<00004> 00050412 P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:0 fRepeat:1 fUp:1

Dada a captura de mensagens do Spy ++ acima, tentei enviar a sequência exata da mensagem usando o seguinte código (simplificado):

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);

Isso não funcionou.

E isso leva à minha próxima pergunta.Há mais alguma coisa que eu possa tentar ou há algo que estou fazendo errado aqui?

Sempre que eu capturei a saída do meu programa usando o Spy ++, aqui está o que foi registrado:

<00001> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 00050412 R WM_SYSKEYDOWN
<00003> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00004> 00050412 R WM_SYSKEYDOWN
<00005> 00050412 S WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00006> 00050412 R WM_SYSKEYUP
<00007> 00050412 S WM_KEYUP nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00008> 00050412 R WM_KEYUP

Observe que existemextra mensagens enviadas nas linhas 2, 4, 6 e 8.Poderia ser essa a razão pela qual as coisas não estão funcionando?

Eu tenho uma pergunta final sobre a diferença entre as mensagens capturadas da entrada real do teclado e as capturadas usando o meu aplicativo. Observe ocepepeat, ScanCode, expandidoetc.argumentos. Eles são diferentes de zero nas mensagens que foram capturadas usando meu teclado como entrada e todas elas são zero nas mensagens enviadas pelo meu aplicativo.Esta poderia ser a razão pela qual meu código não está funcionando? Em caso afirmativo, como modifico esses valores? (Estou supondo que eles vêm do quarto argumento para a função SendMessage, que eu defini para zero em todos os casos.)

Obrigado,

Jan

questionAnswers(2)

yourAnswerToTheQuestion