Перехват мыши

В настоящее время я пишу программу, которая удерживает кнопку мыши при первом нажатии и продолжает удерживать ее, пока пользователь не нажмет кнопку мыши во второй раз.

Программа работает, обнаруживая ввод глобально с помощью 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 библиотека.

Как это устроено?

  1. Первой мышкой установите флаг m_SupressNextUp - вниз уволен.
  2. Кнопка мыши вверх, которая следует за предыдущим вниз, подавляется и устанавливает флаг m_SupressNextDown
  3. Второй даун тоже подавляется и сбрасывает флаг m_SupressNextUp
  4. Second up срабатывает и сбрасывается m_SupressNextDown
  5. Система возвращается в исходное состояние.

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();

        }
    }
}
Другие вопросы по тегам