.Net,向不带窗口运行的命令行进程发送按键/消息



基本上,我正在尝试创建一个简单的GUI来与Robocopy一起使用。我用一个过程打开Robocopy,并将输出重定向到一个文本框,如下所示:

    With MyProcess.StartInfo
        .FileName = "c:windowssystem32robocopy.exe"
        .Arguments = Chr(34) & srce & Chr(34) & " " & Chr(34) & dest & Chr(34)"
        .UseShellExecute = False
        .CreateNoWindow = True
        .RedirectStandardOutput = True
        .RedirectStandardError = False
    End With
    MyProcess.Start()
    MyProcess.BeginOutputReadLine()  

您可以使用暂停/中断键暂停Robocopy过程。我希望通过表单上的暂停按钮来复制这种功能,但我很难找到任何可以成功发送按键的代码。我想这归结为不知道如何将信息发送到"看不见的"机器人复制过程。提前谢谢。如果我能提供任何其他信息,请告诉我。

您可以使用PSSuspend挂起进程,而无需发送键击-您可以从MyProcess对象中获取要传递的进程ID。

您应该试试PostMessage。我相信,即使窗户是隐藏的,你也可以得到窗户把手。

[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

然后:

PostMessage(MyProcess.MainWindowHandle, 0x100, 0x13, 0);
PostMessage(MyProcess.MainWindowHandle, 0x101, 0x13, 0);

0x100表示按键向下,0x101表示按键向上,0x13表示暂停。检查http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx用于虚拟密钥代码。

由于您正在重定向StdIn和StdOut,我假设Robocopy.exe是一个console应用程序。

如果是这种情况,那么按下暂停实际上是暂停托管robocopy的控制台。

我真的不知道你问题的实际答案,但这可能会让你走上正轨。也许SendKeys功能会有所帮助。

最新更新