2010-06-20 7 views
3

J'ai essayé d'envoyer une clé à une application. Pour un test facile, j'ai juste utilisé le bloc-notes. Voilà à quoi ressemble le code:C# et SendMessage (touches) ne fonctionnent pas

[DllImport("USER32.DLL", EntryPoint = "SendMessageW", SetLastError = true, 
     CharSet = CharSet.Unicode, ExactSpelling = true, 
     CallingConvention = CallingConvention.StdCall)] 
    public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam); 


     const int WM_KEYDOWN = 0x100; 
    const int WM_a = 0x41; 

     public void Press() 
    { 
     Process[] p = Process.GetProcessesByName("notepad"); 
     IntPtr pHandle = p[0].MainWindowHandle; 

     SendMessage(pHandle, WM_KEYDOWN, WM_a, 0); 
    } 

Mais rien ne se passe.

Mon but principal est d'envoyer la clé à une application élevée, mais je serais heureux de l'envoyer au bloc-notes en premier. Je veux travailler avec SendMessage, parce que je veux contrôler combien de temps j'appuie sur un bouton, aussi je ne veux pas avoir l'autre application au premier plan. C'est la raison pour laquelle je ne travaille pas avec SendKeys.

Répondre

8

Plusieurs problèmes:

  • Votre déclaration est erronée, les 2 derniers paramètres sont IntPtr, pas int
  • Vous devez utiliser PostMessage, pas SendMessage
  • Vous envoyez à la mauvaise fenêtre. La fenêtre d'édition du Bloc-notes est une fenêtre enfant
  • Vous oubliez d'envoyer WM_KEYUP
  • La lettre réelle que vous obtenez dépendra de l'état de la touche Shift

Le coup de cou: Vista et Win7 UIPI (L'isolement de privilège d'interface utilisateur) empêche un processus restreint d'injecter des messages dans un processus élevé.

Questions connexes