|
Вопрос # 66/ вопрос открыт / |
|
Уважаемые эксперты!
Столкнулся с проблемой... В приложении функция, которая возвращает код нажатой на клавиатуре клавиши. Но происходит странное - если форма свёрнута, то функция перестаёт работать! Вызов происходит по таймеру, таймер работает. А вот функция - уже нет. В справке GetKeyboardState() не описано о каких-либо ограничениях этой функции... Тогда почему же не работает? Очень надеюсь на вашу помощь! Заранее благодарю за ответы.
Приложение: Переключить в обычный режим- function KeyPressed(minVkCode : TVirtualKeyCode = 0) : TVirtualKeyCode;
- var
- i : Integer;
- buf : TKeyboardState;
- begin
- Assert(minVkCode>=0);
- Result:=-1;
- if GetKeyboardState(buf) then begin
- for i:=minVkCode to High(buf) do begin
- if (buf[i] and $80)<>0 then begin
- Result:=i;
- Break;
- end;
- end;
- end;
- end;
 |
Вопрос задал: Dron (статус: Студент)
Вопрос отправлен: 27 июня 2006, 16:42
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Создал я проект, кинул на форму таймер и Мемо. В обработчике OnTimer() написал код (см. приложение). Интервал у таймера поставил по минимуму. Так вот, в мемо добавляется строка, только когда окно программы активно. Я свернул все окна, кроме окна этой проги и попытался переименовать ярлык на рабочем столе, используя клаву "пробел". В Мемо не добавилось ни одной строки. Видимо, функция GetKeyboardState() работает только в активном приложении/окне. А активное приложение очищает буфер клавы после считывания его содержимого.
Если пишешь кейлоггер, то советую поставить клавиатурный хук (SetWindowsHookEx()). Статей на эту тему в инете - тьма.
 |
Ответ отправил: 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™ (статус: Доктор наук), 28 июня 2006, 10:02 [#1]:
Вы просто повторили мой вопрос.
А вопрос был: Тогда почему же не работает?
Ну я и ответил: "Видимо, функция GetKeyboardState() работает только в активном приложении/окне...".
Я спрашивал, как от этого избавиться. Хуки не предлагать.
Почему не предлагать хуки? Именно для этих целей их придумали в Microsoft. Но, как говорится, хозяин - барин.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Dron (статус: Студент), 28 июня 2006, 10:14 [#2]:
Странное у вас понятие ответа. Там нет чего-либо сверхестественного, что могло бы не работать при свёрнутом окне.
Хуки - механизм глючный и крайне ненадёжный. Да и программа совсем другие операции делает.
С уважением.
|
|
Матвеев Игорь Владимирович (статус: Студент), 29 июня 2006, 05:31 [#3]:
Здравствуйте, Dron!
Наверное никак, если не считать хуки, перехват API или инжект кода. Хотя, если это Вам так нужно, можно покапать в сторону работы напрямую с драйвером клавиатуры.
Но, самый простой вариант - перебор циклом.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|