C# Как двигать мышкой в окне в многопоточном режиме? C#, Visual Studio. Есть функция SetCursorPos() из библиотеки user32.dll, но она нормально работает лишь когда окно активно и в один поток. Если окно не активно, то мышка не двигается в этом окне. Есть задача двигать мышкой в многопотоке указывая в каком окне её двигать. Для идентификации окна ясное дело используется заголовок окна. Подскажите пожалуйста каким образом решается задача перемещения мыши в многопоточном режиме, когда в каждом потоке своё окно, и не используя функцию SetCursorPos()? Если можно, то с примером кода.
Для перемещения мыши в многопоточном режиме в каждом потоке своё окно можно воспользоваться библиотекой InputSimulator, которая позволяет эмулировать ввод с клавиатуры и мыши.
Пример кода:
using InputSimulator; using System; using System.Threading; class Program { static void Main() { // Создаем потоки для каждого окна Thread thread1 = new Thread(() => MoveMouse("Window 1")); Thread thread2 = new Thread(() => MoveMouse("Window 2")); // Запускаем потоки thread1.Start(); thread2.Start(); } static void MoveMouse(string windowTitle) { // Получаем handle окна по заголовку IntPtr windowHandle = WinApi.FindWindow(null, windowTitle); if (windowHandle != IntPtr.Zero) { // Создаем экземпляр InputSimulator InputSimulator inputSimulator = new InputSimulator(); // Перемещаем мышь в центр окна inputSimulator.Mouse.MoveTo(windowHandle); // Делаем клик в центр окна inputSimulator.Mouse.LeftButtonClick(); } else { Console.WriteLine("Окно с заголовком '{0}' не найдено", windowTitle); } } }
Для работы с библиотекой InputSimulator нужно установить пакет WindowsInput через NuGet Package Manager:
Install-Package WindowsInput
Также используется функция FindWindow из класса WinApi для поиска окна по заголовку. Вот реализация этой функции:
using System; using System.Runtime.InteropServices; using System.Text; public static class WinApi { [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); }
Теперь потоки будут двигать мышку в указанных окнах независимо друг от друга.
Для перемещения мыши в многопоточном режиме в каждом потоке своё окно можно воспользоваться библиотекой InputSimulator, которая позволяет эмулировать ввод с клавиатуры и мыши.
Пример кода:
using InputSimulator;using System;
using System.Threading;
class Program
{
static void Main()
{
// Создаем потоки для каждого окна
Thread thread1 = new Thread(() => MoveMouse("Window 1"));
Thread thread2 = new Thread(() => MoveMouse("Window 2"));
// Запускаем потоки
thread1.Start();
thread2.Start();
}
static void MoveMouse(string windowTitle)
{
// Получаем handle окна по заголовку
IntPtr windowHandle = WinApi.FindWindow(null, windowTitle);
if (windowHandle != IntPtr.Zero)
{
// Создаем экземпляр InputSimulator
InputSimulator inputSimulator = new InputSimulator();
// Перемещаем мышь в центр окна
inputSimulator.Mouse.MoveTo(windowHandle);
// Делаем клик в центр окна
inputSimulator.Mouse.LeftButtonClick();
}
else
{
Console.WriteLine("Окно с заголовком '{0}' не найдено", windowTitle);
}
}
}
Для работы с библиотекой InputSimulator нужно установить пакет WindowsInput через NuGet Package Manager:
Install-Package WindowsInputТакже используется функция FindWindow из класса WinApi для поиска окна по заголовку. Вот реализация этой функции:
using System;using System.Runtime.InteropServices;
using System.Text;
public static class WinApi
{
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}
Теперь потоки будут двигать мышку в указанных окнах независимо друг от друга.