Question

Tout d'abord, Je suis en train d'envoyer l'entrée du clavier à une application de fond (Une fenêtre qui does'nt ont mise au point ou peut ne pas apparaître même visible à l'utilisateur).

Je l'ai vérifié que la winHandle et constantes sont correctes. Le problème est l'application de fond ne semble pas le message, SAUF SI, Je mets un point d'arrêt sur la PostMessage () la ligne et appuyez sur F10 (étape plus) ou F5 (Suite) quand il y arrive, puis la combinaison de touches se comme par magie envoyé.

Qu'est-ce qui se passe? 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);

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

Était-ce utile?

La solution

  

Utilisation 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 ints. 8 octets, et non 4. Correction:

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

Cependant, cela ne peut pas réellement résoudre votre problème. En mode 64 bits, les 4 premiers arguments d'un procédé non-instance sont transmises dans des registres, et non pas la pile. Il se trouve que cette méthode a 4 arguments, vous n'obtiendrez l'avertissement PInvokeStackImbalance MDA. Et les 32 bits supérieurs des valeurs de registre de 64 bits sont souvent zéro par accident de sorte qu'il n'a pas d'importance si le P / Invoke marshaller génère un 32 bits ou une valeur de l'argument 64 bits.

Il faut remarquer que cette approche est tout à fait problématique dans la pratique. Vous ne pouvez pas contrôler l'état du clavier dans le processus cible. Vous envoyez la combinaison 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. Seulement SendInput () peut fonctionner de manière fiable. Eh bien, à court du problème de mise au point de la fenêtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top