Лучший способ приостановить крюк низкого уровня (winapi)

Я хотел бы знать, каков наилучший способ с точки зрения эффективности (использование процессора / памяти) временно приостановить / обойти низкоуровневую зацепку мыши / клавиатуры.

Текущее решение, которое я нашел, состоит в том, чтобы установить глобальную переменную "doHook" в примере, протестировать ее в обработчике ловушки и, если она не установлена, просто дать ему пройти с CallNextHookEx следующим образом:

    if ((nCode < 0) || (!doHook))
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }

Это хорошее решение? лучший способ?

Спасибо

1 ответ

Решение

У вас есть 2 варианта:

  • Снятие крючка целиком путем вызова UnhookWindowsHookEx,
  • Оставить крюк на месте и пропустить нормальную работу.

Низкоуровневые зацепки для клавиатуры и мыши несколько дороги, поскольку они вводят дополнительные переключатели контекста для обработки событий ввода:

Хук [...] не вводится в другой процесс. Вместо этого контекст переключается обратно на процесс, который установил хук, и он вызывается в своем первоначальном контексте. Затем контекст переключается обратно на приложение, которое сгенерировало событие.

По сути, ваш хук бездействия все еще использует тысячи тактов для переключения контекста, для всех входных событий. Чтобы свести к минимуму общее воздействие, вам следует рассмотреть возможность полного удаления крючка и его повторной установки при необходимости.

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