Как узнать, ЗАжата ли обычная клавиша?
Вот есть часть кода :
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!!!');
Мне надо, чтобы это окно выводилось только пРИ ПЕРВОМ нажатии...и при следующих. Но никак не в случае, когда клавиша просто нажата и не отпускается.
Помогите, кто чем может !
1) Проверять в KeyUP. Но догда сообщение выведется только при отпускании клавиши.
2) Создать переменую которая будет держать сосотояние клавиши. Но тогда придётся либо всегда проверять её состояние либо устанавливать KeyUp.
P.S. По видимому без KeyUp-а не обойтись
Ответ - длительный временной промежуток между нажатием и подъёмом клавиши.
Делаем так:
1. В обработчике OnKeyDown отслеживаем нажатие клавиш. Если клавиша - которую нужно отследить - запускаем таймер.
2. В обработчике OnKeyUp отслеживаем подъём клавиш. Если клавиша - которую нужно отследить - останавливаем таймер.
3. В обработчике OnTimer останавливаем таймер и выводим сообщение.
Действуйте-злодействуйте :D
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
ан нет...
Что это было :confused: ?????
Вообще, что за программа пишется, обычная оконная или же консольное приложение?
Если обычная - то способ я уже привёл
при нажатии клавиши вызывается функция Key_Hook (из dll файла). Так что простыми обработчиками OnKeyDown/Up я не могу пользоваться.....
Кстати, не подскажете тогда может, какой модуль нужен для KeyUp ??
var KeyState:integer;
....
KeyState:=GetKeyState(wParam);
if KeyState>=0 then {Код программы}
//If KeyState < 0 Then "Нажата кнопка с кодом "
//Else = "Отпущена кнопка с кодом "
Теперь работает (код выполняется только при отпускании клавиши),но в играх и Word'е код выполняется и при нажатии..и при удерживании клваиши !!!! :((
Как быть ?
Решил переделать программу...вместо хука 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
Но не получается....
Так как мне узнать, какая клавиша была нажата ?
if TMsg(Pointer(lParam)^).message = WM_KEYUP then
вот здесь вся проблема. Не обрабатывается отжатие кнопки. А почему ? ! Хотя вроде делаю всё правильно.......