Как сделать клик без перемещения курсора в неактивном окне программы?

В C# можно реализовать клик без перемещения курсора в неактивном окне программы путем использования методов из пространства имен User32.dll.

Для начала нам понадобится подключить пространство имен System.Runtime.InteropServices, чтобы иметь доступ к функционалу User32.dll. Далее нам понадобятся следующие методы: FindWindow, SetForegroundWindow и SendMessage.

1. FindWindow используется для поиска окна приложения по его заголовку или имени класса.
2. SetForegroundWindow используется для установки окна приложения на передний план.
3. SendMessage используется для отправки сообщения мыши в окно.

Ниже показан пример реализации функции для выполнения клика без перемещения курсора в неактивном окне:

using System;
using System.Runtime.InteropServices;

public class MouseClicker
{
    private const int WM_LBUTTONDOWN = 0x201;
    private const int WM_LBUTTONUP = 0x202;

    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    public static void Click(string windowTitle)
    {
        // Находим окно по его заголовку
        IntPtr windowHandle = FindWindow(null, windowTitle);
        if (windowHandle == IntPtr.Zero)
        {
            Console.WriteLine("Окно не найдено");
            return;
        }

        // Переводим окно в фокус
        SetForegroundWindow(windowHandle);

        // Отправляем сообщение мыши в окно
        SendMessage(windowHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
        SendMessage(windowHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
    }
}

Пример использования:

string windowTitle = "Название окна программы";
MouseClicker.Click(windowTitle);

В данном примере функция Click выполняет клик на окно программы с указанным в параметре windowTitle заголовком. Если окно не найдено, выводится сообщение об этом.

Однако следует отметить, что такие действия могут нарушать безопасность и являются не желательными. Этот метод может не работать с некоторыми приложениями или в разных операционных системах. Используйте его с осторожностью, учитывая контекст и требования безопасности вашего приложения.