2010-04-09 5 views
3

Le code sendkeys ci-dessous fonctionne bien pour le Bloc-notes, mais il ne fonctionne pas pour la calculatrice. Quel est le problème? (Il est un autre problème par rapport à ce que j'ai envoyé ici Sendkeys problem from .NET program).NET sendkeys à la calculatrice

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName); 
[DllImport("User32")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 
private void button1_Click(object sender, EventArgs e) 
{ 
    IntPtr calculatorHandle = FindWindow("SciCalc", "Calculator"); 
    //IntPtr calculatorHandle = FindWindow("Notepad", "Untitled - Notepad"); 
    if (calculatorHandle == IntPtr.Zero) 
    { 
     MessageBox.Show("Calculator is not running."); 
     return; 
    } 
    SetForegroundWindow(calculatorHandle); 
    System.Threading.Thread.Sleep(1000); 
    SendKeys.SendWait("111*11="); 
    //SendKeys.SendWait("{ENTER}"); 
    //cnt++; 
    SendKeys.Flush(); 
} 

Répondre

7

Je vais vous dire comment vous pouvez savoir comment envoyer keystorkes à Calc.exe.

Utilisez spy ++ pour surveiller les messages dans le processus de la fenêtre calc.exe lorsque vous l'utilisez. Pour ce faire, allez dans spy ++ et cliquez sur le bouton de la barre d'outils des messages de journal. Faites glisser le curseur sur la fenêtre calc.exe. Les instructions que j'ai donné sont pour VS2008, elles peuvent différer légèrement pour le Spy ++ inclus dans d'autres versions de VS. Mais la même fonctionnalité a toujours été disponible.

Vous verrez exactement quels messages sont envoyés lorsque vous entrez du texte. Tu as besoin de faire la même chose.

Utilisez l'API Win32 SendMessage, LPARAM et WPARAM à votre handle de fenêtre trouvé.

+0

Je appuie l'utilisation de SendMessage au lieu de SendKeys. Vous pouvez trouver des informations connexes ici: http://msdn.microsoft.com/en-us/library/ms646280 –

+0

n'est pas SendKeys juste un wrapper SendMessage? – Adam

+0

@Adam: Probablement mais pas sûr. Je suppose que ma suggestion était que peut-être vous avez besoin de faire d'autres commandes en plus des touches. Mais quoi que ce soit, vous pouvez le comprendre en regardant les messages. –

0

Je suppose que j'ai eu le problème. Le timing est le problème ici. Tant que je mets sleep() b/w en envoyant la commande, le calc.exe le fait bien. Ce n'est pas une bonne solution cependant.

+0

@ user203123: Où mettez-vous le sommeil ? –

+0

Votre code posté (j'ai dû changer "SciCalc" en "CalcFrame" depuis que je suis sur Win7) a bien fonctionné pour moi. La sortie était "1221". – Adam

0

Sur Windows 7, vous devez faire ceci:

IntPtr calculatorHandle = FindWindow("CalcFrame", "Calculator"); 
+0

mais en fonction de ce que vous venez de publier, je suppose que votre problème n'était pas d'acquérir une poignée de fenêtre – Adam