Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать, ЗАжата ли обычная клавиша?

5.2K
19 ноября 2006 года
SerMax
96 / / 04.11.2006
Хотелось бы знартЬ, можно ли отследить ЗАжатие обычной клавиши (например "g").
Вот есть часть кода :

function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;stdcall; export;
var ch:char;
begin
ch:=chr(wParam);
if HiWord(GetKeyState(VK_MENU)) <> 0 then
begin
if HiWord(GetKeyState(VK_CONTROL)) <> 0 then
if (ch='g') or (ch='G') then
begin
ShowMessage('Nazali ALT+CTRL+g!!!');
end;
end;

Я зажимаю ALT+CTRL+g....если g ЗАжата (я её не отпускаю), то выводится сообщение ShowMessage('Nazali ALT+CTRL+g!!!');
Мне надо, чтобы это окно выводилось только пРИ ПЕРВОМ нажатии...и при следующих. Но никак не в случае, когда клавиша просто нажата и не отпускается.
Помогите, кто чем может !
7.9K
19 ноября 2006 года
***Zebr@XXL***
47 / / 18.08.2005
Есть несколько способов.
1) Проверять в KeyUP. Но догда сообщение выведется только при отпускании клавиши.
2) Создать переменую которая будет держать сосотояние клавиши. Но тогда придётся либо всегда проверять её состояние либо устанавливать KeyUp.

P.S. По видимому без KeyUp-а не обойтись
309
19 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Что можно понимать под "зажатием"?
Ответ - длительный временной промежуток между нажатием и подъёмом клавиши.
Делаем так:
1. В обработчике OnKeyDown отслеживаем нажатие клавиш. Если клавиша - которую нужно отследить - запускаем таймер.
2. В обработчике OnKeyUp отслеживаем подъём клавиш. Если клавиша - которую нужно отследить - останавливаем таймер.
3. В обработчике OnTimer останавливаем таймер и выводим сообщение.
Действуйте-злодействуйте :D
5.2K
19 ноября 2006 года
SerMax
96 / / 04.11.2006
Хотелосы бы через lParam это усторить ,а не городить с таймерами :)

function Key_Hook(Code: integer; wParam: word; lParam: DWord): Longint;stdcall; export;
var Key:Word;

описание lParam :

lParam
[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
25-28
Reserved.
29
Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
31
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.

ТАк вот я сижу уже битый третий час и не могу никак сделать ,как надо..всё не работает :(
Пишу
if (LoWord(lParam)=1) then

ан нет...
309
19 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
SerMax
Что это было :confused: ?????
Вообще, что за программа пишется, обычная оконная или же консольное приложение?
Если обычная - то способ я уже привёл
5.2K
19 ноября 2006 года
SerMax
96 / / 04.11.2006
Программа перехватывает ВСЕ нажатия клавиш в системе и обрабатывает их (громкость хочу изменять с клавиатуры :) ).
при нажатии клавиши вызывается функция Key_Hook (из dll файла). Так что простыми обработчиками OnKeyDown/Up я не могу пользоваться.....

Кстати, не подскажете тогда может, какой модуль нужен для KeyUp ??
5.2K
21 ноября 2006 года
SerMax
96 / / 04.11.2006
Вроде кой-что сделал :
var KeyState:integer;
....
KeyState:=GetKeyState(wParam);
if KeyState>=0 then {Код программы}
//If KeyState < 0 Then "Нажата кнопка с кодом "
//Else = "Отпущена кнопка с кодом "

Теперь работает (код выполняется только при отпускании клавиши),но в играх и Word'е код выполняется и при нажатии..и при удерживании клваиши !!!! :((
Как быть ?
5.2K
22 ноября 2006 года
SerMax
96 / / 04.11.2006
!!! Всё же надеюсь на вашу помощь, а то надоело сидеть часами и ломать голову над этим.....
Решил переделать программу...вместо хука WK_KEYBOARD использую хук WH_GETMESSAGE.

Нахожу информацию о нём :

WH_GETMESSAGE

Windows вызывает этот хук перед выходом из функций GetMessage и PeekMessage. Фильтрующие функции получают указатель на структуру с сообщением, которое затем (вместе со всеми изменениями) посылается приложению, вызвавшему GetMessage или PeekMessage. В lParam находится указатель на структуру MSG:typedef struct tagMSG { /* msg */
HWND hwnd; // Окно, чья Winproc получит сообщение
UINT message; // Номер сообщения
WPARAM wParam;
LPARAM lParam;
DWORD time; // Время посылки сообщения
POINT pt; // Позиция указателя мыши (в экранных координатах)
// для этого сообщения
} MSG;

Раньше я через wParam в моей фенкции, вызываемой по нажатию клавиши
function Key_Hook(Code: integer; wParam: word; lParam: longint): Longint;stdcall; export;
получал код клавиши.

Пытаюсь это осуществить здесь. Пишу :
case TMsg(Pointer(lParam)^).wParam of
VK_ADD:VolumeHigh; // мои функции
VK_SUBTRACT:VolumeLow;
VK_MULTIPLY: VolumeOnOff

Но не получается....
Так как мне узнать, какая клавиша была нажата ?
5.2K
22 ноября 2006 года
SerMax
96 / / 04.11.2006
Хотя уж ладно, вроде бы просто через wParam достать можно код клавиши....вся проблема не в том заключается.

if TMsg(Pointer(lParam)^).message = WM_KEYUP then

вот здесь вся проблема. Не обрабатывается отжатие кнопки. А почему ? ! Хотя вроде делаю всё правильно.......
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог