Schreiben in die Konsole eines anderen Prozesses mithilfe der API (ohne die Standardeingabe umzuleiten)

Alex.C.

Ich suche nach einer Möglichkeit, mit einer WinApi in die Konsole eines anderen Prozesses zu schreiben, ohne die Standardeingabe des Prozesses umzuleiten.

Grundsätzlich ist meine Anwendung (in C# geschrieben) ein Wrap für eine andere Konsolenanwendung.

Diese Drittanbieter-App akzeptiert Benutzerbefehle in ihrer Konsole. Meine Wrap-Anwendung muss sie starten und solche Befehle in ihre Konsole schreiben. Ich bin jedoch darauf beschränkt, den Standard-Eingabestream umzuleiten, da dies zum Absturz der Drittanbieteranwendung führt.

Ich suche also nach einer Lösung mit einer WinAPI (oder auf andere Weise) zur Lösung dieses Problems.

Hier ist ein kurzer Teil des Codes (in der Hoffnung, dass er relevant ist, um darzustellen, was ich versuche):

ProcessStartInfo startInfo = new ProcessStartInfo
{
    FileName = path
    ,Arguments = string.Join(" ", Args)
    ,UseShellExecute = false
    ,CreateNoWindow = true
    ,RedirectStandardOutput = true
    ,RedirectStandardError = true
    //,RedirectStandardInput = true //This leads the process to crash!
};

Process myProcess = new Process
{
    StartInfo = startInfo
};

myProcess.Start();

/*...*/

public void SendInput(string input)
{
    //TODO: see how to send input to process' console   
    int result = SendMessage(myProcess.Handle, 0x000C, 0, input + '\n'); // Not working :(
}
Alex.C.

Immerhin habe ich eine Lösung gefunden, indem ich Tastenanschläge an den Prozess gesendet habe. Wenn ich zB einen vollständigen Befehl schreiben möchte, sende den zugehörigen Tastencode für jedes Zeichen aus dem Befehlsstring, gefolgt von einem 'ENTER'.

Code:

    const uint WM_KEYDOWN = 0x100;
    const uint KEY_ENTER = 13;

    [DllImport("user32.dll")]
    public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    public static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern short VkKeyScanA(char ch);

    public void SendInput(string input)
    {
        IntPtr windowHandle = FindWindowByCaption(IntPtr.Zero, myProcess.MainWindowTitle);

        foreach(char c in input)
        {
            PostMessage(windowHandle, WM_KEYDOWN, ((IntPtr)VkKeyScanA(c)), IntPtr.Zero);
        }
        PostMessage(windowHandle, WM_KEYDOWN, ((IntPtr)KEY_ENTER), IntPtr.Zero);
    }

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Umleiten der Ausgabe eines Prozesses in die Eingabe eines anderen Prozesses mithilfe von ProcessBuilder in Java

Interagieren Sie mit der Standardeingabe / -ausgabe eines anderen Prozesses

Verketten Sie die Ausgabe eines Prozesses mit der Eingabe eines anderen Prozesses

Schreiben Sie in die Konsole, ohne in die umgeleitete Ausgabe zu schreiben

Kann die Thread-ID eines Multithread-Prozesses mit der Prozess-ID eines anderen laufenden Prozesses übereinstimmen?

Wie liest man die Ausgabe eines Prozesses und schreibt sie in die Eingabe eines anderen Prozesses in C?

Ändern Sie die Schriftart eines gesamten Dokuments, ohne die Formatierung mithilfe der Google Text & Tabellen-API zu beeinträchtigen

Erhalten eines anderen Port-Fehlers in der Konsole beim Hochladen von Bildern vom Frontend mithilfe von React Js auf die Mongo-Datenbank

So erhalten Sie die Umgebungsvariable eines anderen Prozesses mit c #

So ändern Sie die Standardeingabe von der Konsole in ein anderes Programm in Eclipse

Schreiben in die Rohdaten eines anderen Python-Programms, ohne dass ein neuer schwarzer Bildschirm angezeigt wird

Leiten Sie die Ausgabe eines Prozesses sowohl an eine Datei als auch an die Konsole um

Schreiben Sie die Ausgabe der Hilfsklasse in die Konsole

Sperren eines anderen Computers mithilfe von Sockets, ohne die Verbindung zu unterbrechen

Erfassen Sie Zeichen von der Standardeingabe, ohne darauf zu warten, dass die Eingabetaste gedrückt wird

Lesen Sie ein Zeichen aus der Standardeingabe in Go (ohne die Eingabetaste zu drücken).

Der beste Weg, um in PowerShell auf die Konsole zu schreiben

Schreiben Sie die Ausgabe an derselben Stelle in der Konsole

Schreiben Sie nach der asynchronen Schleife in die Konsole

Wie behebe ich die Konsole? Den Namen der Klasse schreiben?

Schreiben Sie JSON in die Konsole

Core Audio User-Space-Plug-In-Treiber - Sandbox, die die Dateninteraktion eines anderen Prozesses verhindert

Ändern Sie die Form eines Arrays mithilfe eines anderen Arrays

Ersetzen Sie die Werte im Array mithilfe der Maske und eines anderen Arrays

C#-Konsolenanwendung: in die PowerShell-Konsole schreiben, ohne an die Pipeline zu senden?

Weiterleiten der Standardausgabe eines Befehls an die Standardausgabe eines anderen Befehls mithilfe der gemeinsam genutzten Datei und von dup2 ()

Zählen Sie die Anzahl der Vorkommen eines Arrays ohne Überlappung in einem anderen Array

subprocess.call ohne Befehl, der in die Konsole schreibt

Node.js fängt die Ausgabe eines anderen Prozesses ab

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv