c# - 如何将按键发送到正在运行的进程对象?

标签 c# .net process input keyboard

我正在尝试让 C# 启动一个应用程序(在本例中为 open office),并开始发送该应用程序按键,使其看起来好像有人在打字。所以理想情况下,我将能够向一个正在运行的 open office 进程发送字母“d”的按键,然后 open office 将在纸上键入 d。任何人都可以根据如何去做给我指导吗?我已尝试执行以下操作:

p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.FileName = processNames.executableName;

p.Start();

p.StandardInput.Write("hello");

但这并没有给我带来预期的效果 - 我没有看到在开放式办公室中输入的文本。

最佳答案

你必须通过 Win32 sendmessages 来做到这一点:基本思路是这样的:

首先,您需要一个指向已启动进程窗口的指针:

using System.Runtime.InteropServices;

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

private void button1_Click(object sender, EventArgs e)
{
  // Find a window with the name "Test Application"
  IntPtr hwnd = FindWindow(null, "Test Application");
}

然后使用 SendMessage 或 PostMessage(我猜在你的情况下是首选):

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

在此消息中指定正确的消息类型(例如 WM_KEYDOWN)以发送按键:

http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx

看看PInvoke.net获取 PInvoke 源代码。

或者,您可以在使用 FindWindow 将该窗口置于前台后使用 SendKeys.Send (.Net) 方法。然而,这有点不可靠。

关于c# - 如何将按键发送到正在运行的进程对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2686865/

相关文章:

c# - Facebook 使用 C# 使用 Graph API 检索数据

c# - 如何在 .NET Core 中捕获异常并使用状态代码进行响应

c - 通过信号量访问共享内存

c# - 如何配置 AutoFixture 在创建许多特定类型时使用枚举值作为种子?

c# - MethodInvoker 如何访问其范围之外的成员?

c# - 从 byte[] 创建并保存图像会导致 Parameter is not valid 异常

c++ - 使用 C++ 获取在后台执行的命令的实际进程 ID

c# - 多个索引可供收藏 - 只有一个作品

c# - 变形此序列的最优雅方式

objective-c - 从 PID 获取名称?