В настоящее время у меня запущен другой процесс внутри формы, и я хочу иметь возможность имитировать щелчки мыши в этом процессе, не затрагивая мою настоящую мышь и не имея необходимости активировать окно формы. Я работал с c# только несколько дней, поэтому я не уверен, возможно ли это вообще.
В настоящее время я слушаю клики на самой форме, которая работает, так как я могу видеть журнал консоли «Форма нажата», однако я не вижу никаких щелчков внутри процесса.
Вот код, который у меня есть:
public partial class Form1 : Form
{
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONUP = 0x0202;
public Form1()
{
InitializeComponent();
startProcess();
}
private void startProcess()
{
Process p = Process.Start("notepad.exe");
p.WaitForInputIdle();
SetParent(p.MainWindowHandle, Handle);
}
private void formClick(object sender, EventArgs e)
{
Console.WriteLine("Form clicked");
Thread.Sleep(500);
PostMessage(FindWindow(null, "Form1"), WM_LBUTTONDOWN, new IntPtr(0x1), CreateLParam(MousePosition.X + 50, MousePosition.Y + 50));
PostMessage(FindWindow(null, "Form1"), WM_LBUTTONUP, new IntPtr(0x1), CreateLParam(MousePosition.X + 50, MousePosition.Y + 50));
}
private static IntPtr CreateLParam(int LoWord, int HiWord)
{
return (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
}
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
}