Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何发送密钥启动隐藏CMD进程_C# - Fatal编程技术网

C# 如何发送密钥启动隐藏CMD进程

C# 如何发送密钥启动隐藏CMD进程,c#,C#,如何将字符密钥发送到隐藏的CMD窗口? 我的代码: 启动隐藏进程: private void button1_Click(object sender, EventArgs e) { p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = true; p.StartInfo.CreateNoWindow = true; p.StartInfo.Win

如何将字符密钥发送到隐藏的CMD窗口? 我的代码:

启动隐藏进程:

private void button1_Click(object sender, EventArgs e)
{
    p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.UseShellExecute = true;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.Start();
    pid = p.Id;
}
发送密钥:

private void button4_Click(object sender, EventArgs e)
{
    var proc1 = Process.GetProcessById(pid);
    SetForegroundWindow(proc1.Handle);
    SendKeys.Send("q");
}
如何将密钥发送到我的进程?(但我的代码启动ffmpeg.exe并发送“q”键停止编码)
谢谢您的回答。

我也遇到了同样的问题,使用ProcessWindowsStyle.Minimized或ProcessWindowsStyle.Normal,它工作正常。似乎无法使用ProcessWindowsStyle.Hidden执行此操作。

您无法将密钥发送到非活动窗口,隐藏窗口无法激活

解决方法:改为隐藏窗口样式。您可以将其最小化,但仍然需要激活它以发送关键点,这样您就可以循环所有正在运行的进程以找到最小化窗口,激活它然后发送关键点并再次最小化它(前景)

将这段代码放入主程序:

[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lp1, string lp2);

[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public Process telnet = new Process();
以下是为您的(p)流程准备的方法:


例如,发送q>>
sendKeys(“q”)

在创建隐藏进程期间,您必须设置
重定向标准输入=true
,否则您的进程将不接受传入密钥

因此,如果您创建了如下流程:

var startInfo = new ProcessStartInfo
{
    FileName = "cmd.exe",
    CreateNoWindow = true,
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Hidden,
    RedirectStandardInput = true
};

var process = Process.Start(startInfo);
您可以通过
StandardInput

if (!process.HasExited)
{
    using (var streamWriter = process.StandardInput)
    {
        // write your message here
        var message = "q";
        streamWriter.WriteLine(message);
        streamWriter.Close();
    }

    process.WaitForExit();
    process.Close();
    process.Dispose();
}

有关详细信息,请转至

您到底想要什么:发送按键?还是停止这个过程?因为,如果是后者,您可能希望使用进程对象直接调用ffmpeg并使用相同的对象停止它。我希望发送键“q”并停止ffmpeg。不是杀戮过程。
var startInfo = new ProcessStartInfo
{
    FileName = "cmd.exe",
    CreateNoWindow = true,
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Hidden,
    RedirectStandardInput = true
};

var process = Process.Start(startInfo);
if (!process.HasExited)
{
    using (var streamWriter = process.StandardInput)
    {
        // write your message here
        var message = "q";
        streamWriter.WriteLine(message);
        streamWriter.Close();
    }

    process.WaitForExit();
    process.Close();
    process.Dispose();
}