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



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

[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public void SendText(IntPtr hwnd, string keys)
{
    if (hwnd != IntPtr.Zero)
    {
        if (SetForegroundWindow(hwnd))
        {
            System.Windows.Forms.SendKeys.Send(keys);
        }
    }
}
Process p;
int pid;

启动隐藏进程:

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"键停止编码(谢谢你的回答。

我遇到了同样的问题,使用ProcessWindowStyle.Minimized或ProcessWindowStyle.Normal,它工作正常。似乎没有办法用ProcessWindowStyle.Hidden做到这一点。

在创建隐藏进程期间,您必须设置RedirectStandardInput = 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();
}

有关更多详细信息,请转到 https://learn.microsoft.com/pl-pl/dotnet/api/system.diagnostics.processstartinfo.redirectstandardinput?view=netframework-4.8

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

解决办法:改为隐藏窗口样式。您可以将其最小化,但仍然需要激活它才能发送密钥,因此您可以遍历所有正在运行的进程以找到最小化的窗口,激活它,然后发送密钥并再次最小化它(前台(。

将这段代码放入您的 main:

[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( 过程准备的方法:

public void sendkeys(string data)
{
    send = true;
    Process s = Process.GetProcessById(p.Id);
    while (s.ProcessName == p.ProcessName && send)
    {
        while (send)
        {
            IntPtr h = s.MainWindowHandle;
            SetForegroundWindow(h);
            SendKeys.SendWait(data);
            Thread.Sleep(1000);
            send = false;
        }
    }
}

例如,发送 q>>> sendKeys("q") ;

最新更新