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