2010-11-27 5 views
2

Tout d'abord, J'essaie d'envoyer une entrée au clavier à une application en arrière-plan (une fenêtre qui n'a pas de focus ou qui n'apparaît même pas visible à l'utilisateur).C# PostMessage pas d'envoi et pas d'erreur

J'ai vérifié que le winHandle et les constantes sont corrects. Problème est l'application d'arrière-plan ne semble pas obtenir le message, SAUF, Je définis un point d'arrêt sur la ligne PostMessage(), et appuyez sur F10 (pas à pas) ou F5 (Continuer) quand il y arrive, puis la frappe magiquement est envoyé.

Ce qui donne? Code pertinent:

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

En utilisant Win7 64 et MS Visual Studio 2008 Pro, l'application de la console. Et le code ci-dessus est sur un thread si cela aide.

+0

peut être le coup de clé qui est envoyé est de F10 ou F5;) –

Répondre

2

En utilisant Win7 64

C'est un peu pertinent, la déclaration est erronée. Fonctionne en mode 32 bits, mais gênant en mode 64 bits. Les deux derniers arguments sont des pointeurs, pas des ints. 8 octets, pas 4. Fix:

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

Toutefois, cela ne résout peut-être pas réellement votre problème. En mode x64, les 4 premiers arguments d'une méthode non-instance sont passés dans les registres, pas dans la pile. Il se trouve que cette méthode a 4 arguments, vous n'obtiendrez pas l'avertissement MDA PInvokeStackImbalance. Et les 32 bits supérieurs des valeurs de registre de 64 bits sont souvent zéro par accident, donc peu importe si le marshaller P/Invoke génère une valeur d'argument 32 bits ou 64 bits.

Attention, cette approche est assez difficile en pratique. Vous ne pouvez pas contrôler l'état du clavier dans le processus cible. Vous envoyez la séquence de touches pour B. Cela peut se transformer en B, b, Alt + B ou Ctrl + B, en fonction de l'état des touches de modification. Seul SendInput() peut fonctionner de manière fiable. Eh bien, à court de problème de mise au point de la fenêtre.

+0

A-ha! Tout est clair pour moi maintenant. La séquence de touches était en cours d'envoi, mais l'application cible ne l'a pas interprétée correctement en raison de l'appui sur ALT. Il semble que je puisse avoir à prendre une autre approche. – Simon