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 MoveMousestringwindowTitlestring windowTitlestringwindowTitle
{ // Получаем handle окна по заголовку IntPtr windowHandle = WinApi.FindWindownull,windowTitlenull, windowTitlenull,windowTitle; if windowHandle!=IntPtr.ZerowindowHandle != IntPtr.ZerowindowHandle!=IntPtr.Zero
{ // Создаем экземпляр InputSimulator InputSimulator inputSimulator = new InputSimulator; // Перемещаем мышь в центр окна inputSimulator.Mouse.MoveTowindowHandlewindowHandlewindowHandle; // Делаем клик в центр окна inputSimulator.Mouse.LeftButtonClick; } else { Console.WriteLine"Окносзаголовком′0′ненайдено",windowTitle"Окно с заголовком '{0}' не найдено", windowTitle"Окносзаголовком′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)DllImport("user32.dll", SetLastError = true)DllImport("user32.dll",SetLastError=true)
public static extern IntPtr FindWindowstringlpClassName,stringlpWindowNamestring lpClassName, string lpWindowNamestringlpClassName,stringlpWindowName; }
Теперь потоки будут двигать мышку в указанных окнах независимо друг от друга.
Для перемещения мыши в многопоточном режиме в каждом потоке своё окно можно воспользоваться библиотекой 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 MoveMousestringwindowTitlestring windowTitlestringwindowTitle {
// Получаем handle окна по заголовку
IntPtr windowHandle = WinApi.FindWindownull,windowTitlenull, windowTitlenull,windowTitle;
if windowHandle!=IntPtr.ZerowindowHandle != IntPtr.ZerowindowHandle!=IntPtr.Zero {
// Создаем экземпляр InputSimulator
InputSimulator inputSimulator = new InputSimulator;
// Перемещаем мышь в центр окна
inputSimulator.Mouse.MoveTowindowHandlewindowHandlewindowHandle;
// Делаем клик в центр окна
inputSimulator.Mouse.LeftButtonClick;
}
else
{
Console.WriteLine"Окносзаголовком′0′ненайдено",windowTitle"Окно с заголовком '{0}' не найдено", windowTitle"Окносзаголовком′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)DllImport("user32.dll", SetLastError = true)DllImport("user32.dll",SetLastError=true) public static extern IntPtr FindWindowstringlpClassName,stringlpWindowNamestring lpClassName, string lpWindowNamestringlpClassName,stringlpWindowName;
}
Теперь потоки будут двигать мышку в указанных окнах независимо друг от друга.