Как симулировать щелчок мышью в скрытом процессе / окне в c#? - PullRequest
0 голосов
/ 16 апреля 2020

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