Вы можете отправить данные в процесс с использованием Interop. Это называется подключением процесса, и на нем есть несколько ресурсов. Мне это нравится answer.
Это небольшой код, который позволяет отправлять сообщения в справочное приложение . Чтобы отправить символ «A», например, вызовите sendKeystroke(Keys.A)
и не забудьте использовать пространство имен System.windows.forms, чтобы иметь возможность использовать объект Keys.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace keybound
{
class WindowHook
{
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public static void sendKeystroke(ushort k)
{
const uint WM_KEYDOWN = 0x100;
const uint WM_SYSCOMMAND = 0x018;
const uint SC_CLOSE = 0x053;
IntPtr WindowToFind = FindWindow(null, "Untitled1 - Notepad++");
IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0);
//IntPtr result3 = SendMessage(WindowToFind, WM_KEYUP, ((IntPtr)c), (IntPtr)0);
}
}
}
Вы, вероятно, легче, чем они, получая приложение вместо того, чтобы искать процесс, потому что вы можете запустить его из приложения:
Process proc = new Process();
proc.StartInfo.FileName = executablePath;
proc.Start();
proc.WaitForInputIdle();
Тогда proc.Id
будет являться PID.
В качестве альтернативы я просто столкнулся с типом VB example, который кажется еще более простым с использованием функции Shell, но я не использовал его раньше. Вам нужно добавить паузу в приложении дождаться приглашения, но это, кажется чище, чем читать Interop:
Dim ProcID As Integer
' Start the Calculator application, and store the process id.
ProcID = Shell("CALC.EXE", AppWinStyle.NormalFocus)
' Activate the Calculator application.
AppActivate(ProcID)
' Send the keystrokes to the Calculator application.
My.Computer.Keyboard.SendKeys("22", True)
My.Computer.Keyboard.SendKeys("*", True)
My.Computer.Keyboard.SendKeys("44", True)
My.Computer.Keyboard.SendKeys("=", True)
' The result is 22 * 44 = 968.
Если ветер с System.ArgumentException
, это, вероятно, потому, что функция Shell не получить идентификатор процесса. Это потому, что ему нужно полное доверие. Приложение будет работать, если оно выполняется как администратор. Я не думаю,, вы найдете простой способ обойти это, если вы не можете этого сделать, так как это проблема безопасности, чтобы приложения запускали друг друга, но я мог ошибаться.
Следует отметить, что был задан аналогичный вопрос [здесь] (http://stackoverflow.com/questions/27088802/batch-file-calling-an-exe-that-has-pause-in-it-how- to-skip) (и связанный выше), но не получил должного ответа – Arvin