В то время как цикл использует много процессорного времени - PullRequest
2 голосов
/ 16 сентября 2009

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

Я получил код, чтобы узнать, как работает keylogger и GetAsyncKeyState () здесь .

Я заставил его работать в Code :: Blocks, но самое странное в том, что когда я проверяю свой диспетчер задач, загрузка процессора увеличивается до 100%. Когда я закрываю программу, она возвращается вниз и возвращается к 100%, когда я снова включаю ее.

Я предполагаю, что это из-за бесконечного цикла while, постоянно проверяющего входы, но я хочу знать, есть ли способ уменьшить загрузку ЦП без потери функции.

P.S Как бы я сделал сочетание клавиш? Например, нажав Ctrl + E , чтобы выйти из программы.

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

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

Большинство приложений не проводят непрерывный опрос состояния клавиатуры, а вместо этого прослушивают события клавиатуры, передаваемые ОС. Во время прослушивания события вашей программе не нужно использовать процессорное время и, таким образом, она будет находиться в спящем режиме до наступления события, освобождая процессор для использования до тех пор.

(Игры часто являются исключением из этого, поскольку они часто опрашивают состояние клавиатуры. Однако они обычно ограничивают частоту выполнения этого действия - обычно не более одного кадра) и, следовательно, использование ЦП по-прежнему ограничено. .)

3 голосов
/ 19 апреля 2010

В основном, вы хотите использовать эту функцию:

HHOOK SetWindowsHookEx(
  __in  int idHook,
  __in  HOOKPROC lpfn,
  __in  HINSTANCE hMod,
  __in  DWORD dwThreadId
);

Вы можете прочитать о том, что означают параметры (и есть множество примеров), но часть, которая отвечает на ваш вопрос, является вторым параметром. Вы устанавливаете lpfn, чтобы указать на функцию обратного вызова, и каждый раз, когда нажимается клавиша, вызывается ваша функция (та, которая регистрирует нажатие клавиши).

Это не только для событий клавиатуры, проверьте это: SetWindowsHook ()

1 голос
/ 19 апреля 2010

В Windows вам нужно вставить низкоуровневый хук клавиатуры с Windows API. Затем вы получите обратный вызов вашей функции LowLevelKeyboardProc , которую затем сможете использовать для входа. Это будет использовать почти 0% ЦП и гарантированно будет ловить каждый ключ.

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

  1. Это будет меньше нагрузки на процессор в LowLevelKeyboardProc, что важно для ловушек низкого уровня.
  2. Работает для других приложений, которые не отслеживают каждое нажатие клавиши.
...