2010-01-10 3 views
2

Je suis en train d'envoyer des frappes de mon programme C# pour une application JavaEnvoi de séquences de touches d'une application C# à une application Java - comportement étrange?

Le code pour les clés Sendig est:

private void SendKeysToWindow(string WindowName, string KeysToSend) 
    { 
     IntPtr hWnd = FindWindow(null, WindowName); 
     ShowWindowAsync(hWnd, SW_SHOWNORMAL); 
     SetForegroundWindow(hWnd); 
     SendKeys.Send(KeysToSend);    
    } 

Ce code fonctionne très bien avec tous les programmes, à l'exception de l'application Java que je Essaie de contrôler.

Par exemple, si je crée un bouton avec le code folowing:

SendKeysToWindow("Java application window name", "{F2}"); 
SendKeysToWindow("Popoup window name", "123"); 

Cela envoie un F2 à la fenêtre principale du programme, où une autre fenêtre apparaît, et la deuxième commande SendKeysToWindow envoie le « 123 » à cette fenêtre. Voici comment cela devrait fonctionner, et c'est le cas avec tous les autres programmes. Cependant, lorsque j'envoie ces commandes au programme Java, ce qui suit arrive: la première commande SendKeysToWindow est exécutée correctement (la fenêtre contextuelle apparaît), mais elle n'envoie pas le "123" à cette fenêtre.

Si vous appuyez de nouveau sur le bouton, le "123" est envoyé à la fenêtre contextuelle et ouvre une autre fenêtre de groupe.

Si je crée deux boutons séparés pour les deux commandes SendKeysToWindow et les pressez l'une après l'autre, les deux commandes s'exécutent correctement.

Quel peut être le problème?

Merci pour l'aide en avanvce, ça me rend vraiment fou.

P.S .: Je suis débutant en C#, alors gardez la réponse simple.

+0

Je suppose que vous mixez des appels synchrones et asynchrones. Essayez 'ShowWindow' au lieu de' ShowWindowAsync'. –

+0

J'ai essayé d'utiliser ShowWindow au lieu de ShowWindowAsync. Il ne fonctionne toujours pas comme prévu, mais le comportement a changé un peu: Au premier clic, la fenêtre du groupe apparaît, mais le "123" ne lui est toujours pas envoyé. Mais si je clique une deuxième fois sur le bouton, la deuxième fenêtre apparaîtra avec le "123" collé au bon endroit! - Au moins, nous nous rapprochons un peu ... –

Répondre

1

Après quelques essais et erreurs, le code suivant semble fonctionner très bien:

private void SendKeysToWindow(string WindowName, string KeysToSend) 
    { 
     IntPtr hWnd = FindWindow(null, WindowName);    
     ShowWindow(hWnd, SW_SHOWNORMAL); 
     SetForegroundWindow(hWnd); 
     Thread.Sleep(50); 
     SendKeys.SendWait(KeysToSend);   
    } 
0

Il semble qu'il puisse y avoir un délai entre l'envoi de {f2} et l'application Java ouvrant la fenêtre contextuelle.

Avez-vous essayé de vérifier si FindWindow réussit ou échoue?

+0

Lorsque je clique sur le bouton pour la deuxième fois, il écrit immédiatement le "123" dans la première fenêtre contextuelle. Je ne peux même pas le voir, parce que la deuxième fenêtre popup le cache immédiatement, de sorte que le retard ne peut pas être beaucoup plus que dans les programmes Windows. J'ai essayé d'ajouter un Thread.Sleep entre les deux commandes SendKeysToWindow, mais sans succès. Je vais essayer les deux ShowWindow au lieu de ShowWindowAsync et vérifier le succès de FindWindow. Qu'en est-il de SendWait au lieu d'envoyer? –

Questions connexes