Comment envoyer des clés à la place de caractères à un processus?
Système.Diagnostics.Processus expose un StreamWriter nommé StandardInput, qui n'accepte que des caractères autant que je sache.
Mais j'ai besoin d'envoyer des séquences de touches, et certaines touches ne correspondent pas bien aux personnages.
Que dois-je faire?
- qui les frappes de touches, par exemple?
- retour arrière Ctrl+C
- C'est l'ultime fuite dans le Unix tuyau d'abstraction. La Redirection se produit par l'intermédiaire de flux de caractères, il ne peut pas simuler non de frappe de touches.
- Êtes-vous en essayant de capturer, puis de le renvoyer à un autre processus, ou tout simplement envoyer les caractères non-imprimables comme un moyen de contrôle, etc.?
- Je suis en train de créer une interface graphique pour un script interactif interprète comme octave.exe
- voir stackoverflow.com/search?q=autohotkey
- Cochez cette question stackoverflow.com/questions/283128/...
Vous devez vous connecter pour publier un commentaire.
Vous mélangez les flux d'entrée avec des signaux de contrôle. Un processus de console a un défaut de flux d'entrée que vous pouvez contrôler avec la StandardInput, comme vous le savez déjà. Mais Ctrl-C et Ctrl-Pause ne sont pas des caractères qui est envoyé au processus par le biais de ce cours d'eau, mais au contraire, ils sont plutôt signaux de contrôle que le processus reçoit utilisant les gestionnaires de signaux, voir CTRL+C et CTRL+PAUSE Signaux:
Pour envoyer de faux signaux à un processus que vous pouvez utiliser
GenerateConsoleCtrlEvent
et envoyezCTRL_C_EVENT
ouCTRL_BREAK_EVENT
. Cette API n'a pas .Net équivalent, de sorte que vous avez à PInvoke il.De l'utiliser à partir .NET vous avez simplement besoin d'inclure la définition de la fonction:
Il y a une entrée Simulateur trouvé ici sur Codeplex qui peut faire le travail pour vous.
Je suis en train de travailler sur un exemple de code et de nouveau ici peu de temps, l'ours à l'esprit l'Entrée du Simulateur est similaire à ce qui a été trouvé dans le lien fourni par Remus...
Edit: j'ai trouvé qu'il y a une limite à cela, vous pouvez certainement obtenir loin avec le typique
System.Windows.Forms.SendKeys.Send
méthode, il ne fonctionne pas de manière efficace!, mais le processus doit avoirUne fenêtre montrant le processus pour que ce soit efficace!
Dans votre cas, c'est une question de trouver la fenêtre, il l'active via pinvoke 'SetForegroundWindow', et envoyer les séquences
^{BREAK}
qui envoie le Ctrl+Pause signal au processus qui fonctionne très bien (surtout si le processus est un programme en ligne de commande ou un fichier de commandes). Voici un article sur CodeProject qui ne ce exactement et de miroirs, le SendKeys...je n'ai pas encore de coller du code dans cette démonstration ....Edit#2: en Fait, je suis assez surpris...que ce code va afficher (preuve de concept)...c'est à l'aide de:
FindWindow
appel d'API, parce que je savais que le titre de la fenêtre a été et était en quelque sorte, en mesure d'apporter à l'avant-plan, et en utilisant le InputSimulator pour envoyer des séquences de touches à elle...ou de les utiliser de la plaine de vieuxSendKeys
fonction...la raison pour laquelle j'ai eu leThread.Sleep
est de veiller à ce que les touches sont envoyées afin d'être " poussé dans la file d'attente clavier de la "fenêtre de premier plan actif", qui, en dépit de cela, est caché"Pinailleurs de côté, je sais que le
netStat
est en cours d'exécution hors de l' 'BackgroundWorker" thread, et j'ai directement invoqué la "PostCtrlC' méthode à partir de l'interface graphique principale du fil...c'est pédant comme une preuve-de-concept de code, mais il montre qu'il a besoin pour mettre en œuvre ISynchronizeInvoke " pour la faire thread-safe, que de côté...il ne fonctionne en effet.Avez-vous vu ce formidable outil - AutoIt. C'est un outil de scripting. Pour envoyer un retour arrière, vous utilisez
Send("{BACKSPACE}")
C'est un outil formidable et il peut aider à automatiser de nombreux clics manuels/double-clique sur/etc.
Est-ce pertinent à votre question ?
Si vous avez un Windows Forms fenêtre que vous pouvez envoyer les touches, puis SendKeys pourrait être une solution appropriée.
Pour la touche de retour arrière et Ctrl+C, qui doit être