繁体   English   中英

如何将keypresses发送到正在运行的流程对象?

[英]How can I send keypresses to a running process object?

我正在尝试使C#启动一个应用程序(在这种情况下是开放式办公室),并开始发送该应用程序按键,使其看起来好像有人正在打字。 理想情况下,我可以发送一个正在运行的开放式办公流程来处理字母“d”的按键,然后打开办公室就会在纸上输入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)方法。 然而,这有点不可靠。

我使用SetForegroundWindow和SendKeys做到了这一点。

我用它来做这个

[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.SendWait(keys);
        }
    }
}

这可以简单地使用。

Process p = Process.Start("notepad.exe");
SendText(p.MainWindowHandle, "Hello, world");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM