7
votes

Comment envoyer des clés au lieu de caractères à un processus?

System.Diagnostics.Process expose un streamwriter nommé StandardInput, qui accepte uniquement des caractères autant que je sache.

Mais je dois aussi envoyer des frappes de frappe, et des coups de frappe ne correspondent pas bien aux personnages.

Que dois-je faire?


6 commentaires

Quel frappe, par exemple?


C'est la future future de l'abstraction des tuyaux UNIX. La redirection se produit à travers des flux de caractères, il ne peut pas simuler les coups de clé de frappe de frappe.


Essayez-vous de capturer puis de vous renvoyer à un autre processus ou d'envoyer simplement des caractères non imprimables comme moyen de contrôle, etc.?


@Marc j'essaie de créer une interface graphique pour un interprète de script interactif comme Octave.exe


Voir Stackoverflow.com/search?q=autohotkey


Vérifiez cette question Stackoverflow.com/Questtions/283128/...


4 Réponses :


3
votes

Avez-vous vu ce superbe outil - AutoIt . Ceci est un outil de script. Pour envoyer un backcace, vous utiliseriez envoyer ("{backspace}")

C'est un excellent outil et il peut vous aider à automatiser de nombreux clics manuels / clics / etc.

est-ce pertinent pour votre question?


2 commentaires

Bonjour, il est pertinent, mais je préfère une solution que je pourrais utiliser directement dans .NET.


@Jader; Il y a une DLL disponible pour AutoIt que vous pouvez facilement ajouter à votre application ...



0
votes

Si vous avez une fenêtre Formulaires Windows que vous pouvez envoyer les touches, alors SendKeys pourrait être une solution appropriée.

pour appuyer sur le dos de l'espace arrière et Ctrl + C, qui doit être P>

SendKeys.Send("{BACKSPACE}^C");


1 commentaires

Envoi de CTRL + C comme ça ne fonctionne pas réellement dans un processus, il devrait être ^ {pause} ...



29
votes

Vous mélangez des flux d'entrée avec des signaux de contrôle. Un processus de console a un flux d'entrée par défaut que vous pouvez contrôler avec la normeInput, comme vous le savez déjà. Mais Ctrl-C et Ctrl-Break ne sont pas des caractères envoyés au processus via ce flux, mais ils sont plutôt signaux de commande forts> que le processus reçoit à l'aide des gestionnaires de signaux enregistrés, voir Ctrl + C et CTRL + Signaux de rupture :

Par défaut, quand une fenêtre de console a la mise au point du clavier, Ctrl + C ou Ctrl + Break est traité comme un signal (Sigint ou Sigbreak) et pas comme Entrée de clavier. P> blockQuote>

envoyer de faux signaux à un processus que vous pouvez utiliser generateconsolectrument code> et envoyer soit ctrl_c_event code> ou ctrl_break_event code>. Cette API n'a pas d'équivalent .net, vous devez donc la pincer. P>

Pour l'utiliser à partir de .NET, vous devez simplement inclure la définition de la fonction: P>

const int CTRL_C_EVENT = 0;
const int CTRL_BREAK_EVENT = 1;

[DllImport("kernel32.dll")]
static extern bool GenerateConsoleCtrlEvent(
    uint dwCtrlEvent,
    uint dwProcessGroupId);


2 commentaires

Google. com / codesearch / på hl = fr # ncfzehh4qla / pubs / ...


J'utilise le processus d'enregistrement de l'écran FFMPEG. Est-ce que cela fonctionne pour moi? En fait, je veux arrêter le début du début de l'enregistrement de l'écran à l'aide de FFMPEG



6
votes

Il y a un simulateur d'entrée trouvé ici sur codeProject qui fait exactement et reflète les envois Sendkeys ... Je colle encore un certain code dans ceci pour démontrer ....

EDIT # 2: En fait, je suis assez surpris ... Comme ce code montrera (preuve de concept ) ... il utilise:

  • InputSImulator (comme mentionné précédemment)
  • Un formulaire Windows composé d'un bouton, lorsque le formulaire est chargé, il exécute automatiquement la classe. En cliquant sur le bouton, il publie une rupture de Ctrl au processus masqué
  • Le flux de sortie est effectivement redirigé et est une fenêtre cachée.
  • La chose étrange, est la sortie est en cours de capture mais ne montre pas les résultats dans la fenêtre de débogage, en temps réel, il est tamponné (je suppose) jusqu'à ce que le processus se termine, l'ensemble de la sortie est affichée. .
  • J'ai triché un peu sur l'appel de l'API FINTWINDOW API, car je savais que le titre de la fenêtre était et qu'il était en quelque sorte capable de l'amener au premier plan et d'utiliser l'entréeImulator pour y envoyer les touches de frappe. .. la file d'attente du clavier de la "fenêtre de premier plan actif", qui, malgré cela, est caché '
  • J'ai utilisé la commande 'netstat -e -e 5' pour boucle pour toujours, rafraîchir les résultats toutes les 5 secondes jusqu'à ce qu'il reçoive un "Ctrl + C" pour casser la boucle infinie. xxx

    nitpicky de côté, je sais que le fichier netstat est en cours d'exécution sur le thread "Backworker" et j'ai invoqué directement la méthode "PostCtrlc" de la Fil d'interface graphique principale ... Ceci est pédant comme un code de la preuve de concept, mais il montre qu'il doit mettre en œuvre «isynchronizeinvoke» pour le faire vitrage, cela de côté ... il fonctionne effectivement.


2 commentaires

Mais si vous avez exécuté plusieurs processus qui utilise netstat.exe, vous affecterez tout avec POSTCTRLC ()? Y a-t-il un moyen de faire la même chose quand vous connaissez la session suivante?


@CONSANTINE Le code ne vise qu'une fenêtre en cours d'exécution netstat.exe. Vous pouvez utiliser le Enumwindows et créer la fonction de rappel EnumwindowsProc pour obtenir la poignée et inspecter la vérification de voir si le titre de cette poignée a NetStat.exe dans le titre ... Si sa constatée, apportez-le dans le premier plan et "zap" comme la preuve de -Concept code ci-dessus montre :)