Глобальный хук & событие отжатия клавиши

  • Автор темы Nowichok
  • Дата начала
N

Nowichok

#1
Пишу программу, которая отлавливает ВСЕ нажатия клавиш в системе. Пишется она для того чтобы регулировать громкость с клавиатуры (клавиатура стандратная, блин :ph34r: ). Привожу часть кода из библиотеки :

Код:
function Key_Hook(Code: integer; wParam: word; lParam: DWord): Longint;stdcall; export;
var KeyState:integer;
begin
If Code>=0 then
begin
if HiWord(GetKeyState(VK_MENU)) <> 0 then
begin
if HiWord(GetKeyState(VK_CONTROL)) <> 0 then
begin
case wParam of
VK_ADD:VolumeHigh; //moya function
VK_SUBTRACT:VolumeLow; //moya function
VK_MULTIPLY:
begin
KeyState:=GetKeyState(wParam);
if HiWord(KeyState)=0 then // {KeyState>=0 toze kak variant}
VolumeOnOff; //moya function
end;
end;
end;
end;
end;
result:=0;
end;
так вот вроде бы всё работает. Зажимаю Alt+CTRL+Num* - звук отрубается. Ещё раз нажимаю - врубается.
НО этого не происходит в играх и в word'е (может и ещё где ,просто тут замечено). Там ,как я ппдодозреваю, происходит лишняя обработка (нажал клавишу + отпустил клавишу)...в итогу звук отрубается и тут же врубается.

Как мне сделать, чтобы я мог контролировать отжатие клавиши и в этих случаях ??
А то уже 4-й день бьюсь над этим..что только не пробовал.
Если чтО ,использую хук WH_KEYBOARD.
 

Kmet

Java Team
25.05.2006
1 036
8
#3
Для: Morpheus
Дык, потому что он(хук) не глобальный
Не совсем понятно откуда взялся такой вывод.

Для: Nowichok
НО этого не происходит в играх и в word'е (может и ещё где ,просто тут замечено).
Во многих играх для получения данный с клавиатуры и мышки используется DirectInput.
 
N

Nowichok

#4
Хук, повторяю, ГЛОБАЛЬНЫЙ ! Не знаю, почему у вас сложилось обратное мнение....и об установке хуков я осведомлён (но всё равно thx за ссылки, прочитал..но ничего нового :( ) . В играх звук изменяется (больше\меньше), но при попытке отрубить его происходит отключение...и тут же включение звука. И я же в играх изменяю не громкость звука в нстройках игры, а громкость в самой системе (Volume Control)-> Wave). Как изменять Volume control там - не в курсе.

а что за DirectInput?? Дайте ссылкИ, плз, что это такое и как его обрабатывать ?? !!
 

morpheus

скриптописец
07.08.2006
3 915
1
#5
Для: Kmet
Для: Nowichok


Прошу сорей... шота мне сегодня повылазило , не видел "Глобальный хук & ...." :(

пятницо наверное

Попробую исчправица << DirectInput >> :)
 
N

Nowichok

#6
Thanks за ссылку. Ща сижу, разбираюсь. Надеюсь, это поможет. А то уже надоело - вроде программа простенькая - а столько проблем
 
N

Nowichok

#7
Появился вопрос :
Обрабатывать клавиатурный ввод методом DirectInput нужно в dll-ке ??? или тут можно вообще без dll-файла обойтись ?
 
N

Nowichok

#8
И ещё :
как через DirectInput узнатЬ, что клавиша была отпущена ?? То, что она нажата - узнать можно, то что отпущена - тоже можно. А вот как насчёт того, что клавиша БЫЛА отпущена ?? Потому что без этого моя проблема остаётся в силе
 
N

Nowichok

#9
Ох, решил проблему элементарным добавление b:boolean, которое отслеживает состояние клавиши до нажатия и после. Просто хотелось решить по-другому это ....