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 :(
}
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.
Lass mich ein paar Worte sagen