C# Как двигать мышкой в окне в многопоточном режиме? C#, Visual Studio.
Есть функция SetCursorPos() из библиотеки user32.dll, но она нормально работает лишь когда окно активно и в один поток. Если окно не активно, то мышка не двигается в этом окне. Есть задача двигать мышкой в многопотоке указывая в каком окне её двигать. Для идентификации окна ясное дело используется заголовок окна. Подскажите пожалуйста каким образом решается задача перемещения мыши в многопоточном режиме, когда в каждом потоке своё окно, и не используя функцию SetCursorPos()?
Если можно, то с примером кода.

21 Авг 2019 в 06:32
312 +1
0
Ответы
1

Для перемещения мыши в многопоточном режиме в каждом потоке своё окно можно воспользоваться библиотекой 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;
}

Теперь потоки будут двигать мышку в указанных окнах независимо друг от друга.

20 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир