如何将字符键发送到隐藏的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”键停止编码) 谢谢你的答案。
答案 0 :(得分:0)
我遇到了同样的问题,使用ProcessWindowStyle.Minimized或ProcessWindowStyle.Normal,它运行正常。看起来似乎没有办法用ProcessWindowStyle.Hidden做到这一点。
答案 1 :(得分:0)
您无法将密钥发送到非活动窗口,隐藏窗口无法激活。
解决方法:改为隐藏窗口样式。您可以将其最小化,但仍然需要激活它以发送密钥,因此您可以遍历所有正在运行的进程以找到最小化窗口,激活它然后发送密钥并再次最小化(前景)。
将这段代码放入主页:
[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);
以下是您(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")
;
答案 2 :(得分:0)
在创建隐藏进程期间,您必须设置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();
}