Перехват мыши
В настоящее время я пишу программу, которая удерживает кнопку мыши при первом нажатии и продолжает удерживать ее, пока пользователь не нажмет кнопку мыши во второй раз.
Программа работает, обнаруживая ввод глобально с помощью MouseHookListener, а затем использует имитатор ввода, чтобы удерживать нажатой кнопку мыши.
Программа может удерживать мышь, как предполагалось, но есть проблема с исходным щелчком мыши, которая сигнализирует программе о том, что она имитирует удерживаемую кнопку; это все еще выполняется. Я знаю, что MouseHookListener использует низкоуровневые хуки для работы, но его метод HookCallBack() не может быть переопределен из-за его защиты.
Есть ли способ заблокировать оригинальный ввод мыши? Или есть способ удержать исходный ввод, пока мышь не будет нажата еще раз?
Это код, который я создал до сих пор (обратите внимание - mListener активируется на другом форуме, где):
public MouseHold()
{
mListener = new MouseHookListener(new GlobalHooker());
mListener.MouseClick += mListener_MouseClick;
}
private bool isDown;
private int count = 0;
private InputSimulator sim = new InputSimulator();
public MouseHookListener mListener;
private void mListener_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (isDown)
{
isDown = false;
Console.Out.WriteLine(count);
}
else
{
Console.Out.WriteLine(count);
isDown = true;
sim.Mouse.LeftButtonDown();
}
}
}
2 ответа
Я являюсь автором библиотеки, о которой вы упомянули https://github.com/gmamaladze/globalmousekeyhook.
Чтобы включить ваш вариант использования, я расширил библиотеку еще одним событием. Обратите внимание, что конструкция слушателя также немного изменилась в новой версии.
Я полагаю, что с помощью приведенного ниже примера вы можете выполнить свой сценарий без участия InputSimulator
библиотека.
Как это устроено?
- Первой мышкой установите флаг
m_SupressNextUp
- вниз уволен. - Кнопка мыши вверх, которая следует за предыдущим вниз, подавляется и устанавливает флаг
m_SupressNextDown
- Второй даун тоже подавляется и сбрасывает флаг
m_SupressNextUp
- Second up срабатывает и сбрасывается
m_SupressNextDown
- Система возвращается в исходное состояние.
internal class Sample
{
private IKeyboardMouseEvents m_GlobalHook;
private bool m_SupressNextUp;
private bool m_SupressNextDown;
public void Subscribe()
{
m_GlobalHook = Hook.GlobalEvents();
m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
m_GlobalHook.MouseUpExt += GlobalHook_MouseUpExt;
}
void GlobalHook_MouseUpExt(object sender, MouseEventExtArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (m_SupressNextUp)
{
Console.WriteLine(@"First mouse up supress.");
e.Handled = true;
m_SupressNextDown = true;
}
else
{
Console.WriteLine(@"Second mouse up - make it heppen.");
m_SupressNextDown = false;
}
}
}
private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (m_SupressNextDown)
{
Console.WriteLine(@"Second mouse down supress.");
e.Handled = true;
m_SupressNextUp = false;
}
else
{
Console.WriteLine(@"First mouse down - make it heppen.");
m_SupressNextUp = true;
}
}
}
public void Unsubscribe()
{
m_GlobalHook.MouseDownExt -= GlobalHookMouseDownExt;
m_GlobalHook.MouseUpExt -= GlobalHook_MouseUpExt;
m_GlobalHook.Dispose();
}
}
После просмотра документации для симулятора ввода, я думаю, вам нужно повернуть ввод мышью вниз.
исходный код для симулятора ввода имеет метод мышки
private void mListener_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (isDown)
{
isDown = false;
Console.Out.WriteLine(count);
sim.Mouse.LeftButtonUp(); //maybe try this
}
else
{
Console.Out.WriteLine(count);
isDown = true;
sim.Mouse.LeftButtonDown();
}
}
}