Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 66

/ вопрос открыт /

Уважаемые эксперты!
Столкнулся с проблемой... В приложении функция, которая возвращает код нажатой на клавиатуре клавиши. Но происходит странное - если форма свёрнута, то функция перестаёт работать! Вызов происходит по таймеру, таймер работает. А вот функция - уже нет. В справке GetKeyboardState() не описано о каких-либо ограничениях этой функции... Тогда почему же не работает? Очень надеюсь на вашу помощь! Заранее благодарю за ответы.

Приложение:
  1. function KeyPressed(minVkCode : TVirtualKeyCode = 0) : TVirtualKeyCode;
  2. var
  3. i : Integer;
  4. buf : TKeyboardState;
  5. begin
  6. Assert(minVkCode>=0);
  7. Result:=-1;
  8. if GetKeyboardState(buf) then begin
  9. for i:=minVkCode to High(buf) do begin
  10. if (buf[i] and $80)<>0 then begin
  11. Result:=i;
  12. Break;
  13. end;
  14. end;
  15. end;
  16. end;


Dron Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Dron (статус: Студент)
Вопрос отправлен: 27 июня 2006, 16:42
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Создал я проект, кинул на форму таймер и Мемо. В обработчике OnTimer() написал код (см. приложение). Интервал у таймера поставил по минимуму. Так вот, в мемо добавляется строка, только когда окно программы активно. Я свернул все окна, кроме окна этой проги и попытался переименовать ярлык на рабочем столе, используя клаву "пробел". В Мемо не добавилось ни одной строки. Видимо, функция GetKeyboardState() работает только в активном приложении/окне. А активное приложение очищает буфер клавы после считывания его содержимого.

Если пишешь кейлоггер, то советую поставить клавиатурный хук (SetWindowsHookEx()). Статей на эту тему в инете - тьма.

Приложение:
  1. procedure TForm1.Timer1Timer(Sender: TObject);
  2. begin
  3. if KeyPressed(VK_SPACE) = VK_SPACE
  4.  
  5. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 28 июня 2006, 09:05
Оценка за ответ: 3

Комментарий к оценке: Вы просто повторили мой вопрос. Я спрашивал, как от этого избавиться. Хуки не предлагать.

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Dron!
GetKeyboardState() показывает состояние клавиатуры в соостетствии с фокусом ввода и, естественно, не реагирует на нажатия клавиш, когда фокус ввода не в Вашем приложении.
Вы можете использовать GetAsyncKeyState(), описание есть в SDK.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 28 июня 2006, 14:02
Оценка за ответ: 5

Комментарий к оценке: Спасибо, теперь понял. Но функция GetAsyncKeyState() мне не очень подходит - нужно узнавать именно код нажатой клавиши, а какая будет нажата - неизвестно. Перебор в цикле ничего хорошего не даст - только загрузит процессор. Игорь, какие ещё есть варианты решения проблемы?

Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 29 июня 2006, 05:31; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 28 июня 2006, 10:02 [#1]:

Вы просто повторили мой вопрос.

А вопрос был: Тогда почему же не работает?

Ну я и ответил: "Видимо, функция GetKeyboardState() работает только в активном приложении/окне...".

Я спрашивал, как от этого избавиться. Хуки не предлагать.

Почему не предлагать хуки? Именно для этих целей их придумали в Microsoft. Но, как говорится, хозяин - барин.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Dron

Dron (статус: Студент), 28 июня 2006, 10:14 [#2]:

Странное у вас понятие ответа. Там нет чего-либо сверхестественного, что могло бы не работать при свёрнутом окне.
Хуки - механизм глючный и крайне ненадёжный. Да и программа совсем другие операции делает.
С уважением.
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 29 июня 2006, 05:31 [#3]:

Здравствуйте, Dron!
Наверное никак, если не считать хуки, перехват API или инжект кода. Хотя, если это Вам так нужно, можно покапать в сторону работы напрямую с драйвером клавиатуры.
Но, самый простой вариант - перебор циклом.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.