Как я могу отправить нажатия клавиш на объект запущенного процесса? - PullRequest
2 голосов
/ 22 апреля 2010

Я пытаюсь заставить 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");

Но это не дает мне желаемого эффекта - я не вижу набранный текст в открытом офисе.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Вы должны сделать это с помощью 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.

Либо вы можете использовать метод SendKeys.Send (.Net) после использования FindWindow, чтобы вывести это окно на передний план. Однако это несколько ненадежно.

1 голос
/ 22 апреля 2010

Я сделал это, используя 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...