2010-12-02 58 views
1

J'essaye d'insérer des valeurs de chaîne à une application tierce disons, notepad. Ci-dessous le code que j'utiliseSimuler l'événement de clavier

[DllImport("user32.dll")] 
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 

public void sim_type(string txt) 
    { 

     const int KEYEVENTF_EXTENDEDKEY = 0x1; 
     const int KEYEVENTF_KEYUP = 0x2; 
     byte[] ASCIIValues = Encoding.ASCII.GetBytes(txt); 

     foreach (byte keyCode in ASCIIValues) 
     { 
      Console.WriteLine("Ascii Values = " + keyCode); 
      keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); 
      keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
     } 


    } 

Je donne un exemple de message texte Par exemple "Ceci est un message de test". Je reçois les bonnes valeurs ASCII. Mais dans la zone de texte cible pour l'exemple de message correspondant, j'obtiens cette sortie.

T89 9 1 13h38 02/12/2010513: 38 02/12/2010 -5175

Aurait-on une aide pour résoudre ce problème. Je mets aussi les valeurs ascii imprimées dans la console

Messsage: Ceci est un message de test

{
Valeurs Ascii = 84

Valeurs Ascii = 104
Valeurs Ascii = 105
Ascii Values ​​= 115
Valeurs Ascii = 32
Valeurs Ascii = 105
Ascii i Valeurs = 115
valeurs ASCII = 32
valeurs ASCII = 97
valeurs ASCII = 32
valeurs ASCII = 116
valeurs ASCII = 101
valeurs ASCII = 115
valeurs ASCII = 116
valeurs ASCII = 32
valeurs ASCII = 109
valeurs ASCII = 101
valeurs ASCII = 115
valeurs ASCII = 115
Valeurs Ascii = 97
Valeurs Ascii = 103
Valeurs Ascii = 101
}

S'il vous plaît quelqu'un aider Merci, Nikil

+0

Voici un exemple de la façon de procéder avec [SendKeys] (http://msdn.microsoft.com/fr-fr/library/ms171548.aspx). – detunized

Répondre

0

premier argument de keybd_event est un code de clé virtuelle, pas Code ASCII. Certains des VK sont identiques à ASCII (c'est pourquoi vous obtenez le premier t!), Mais ce n'est pas la façon de le faire.

Une façon d'obtenir ce que vous voulez est d'utiliser la méthode SendInput. Pour cette méthode, vous pouvez passer un KEYBDINPUT qui a un champ pour transmettre des caractères Unicode (si vous spécifiez l'indicateur KEYEVENTF_UNICODE).

+0

Merci beaucoup. Tu m'as aidé à identifier mon erreur. SendKeys est plus facile que ce que je faisais auparavant. – Nikil

1

keybd_event a été remplacée par SendInput. Je recommande de jeter un oeil à la Windows Input Simulator qui fournit un bon C# Wrapper autour de l'API Send Input. Vous pouvez également simuler les mouvements de la souris avec l'API SendInput (et quelque chose sur laquelle je pense qu'ils travaillent pour la prochaine version du simulateur d'entrée).

J'ai utilisé cette bibliothèque pour un projet d'automatisation et cela semble fonctionner plutôt bien, cependant il y a quelques caprices (IE le keystoke HOME + SHIFT + END ne sélectionne pas tout le texte comme prévu).

+0

Le problème mentionné ci-dessus a été résolu par moi-même en soumettant un patch ici http://inputsimulator.codeplex.com/workitem/13002 Je recommande toujours cette bibliothèque pour tous ceux qui recherchent une interface managée agréable à SendInput. – aolszowka