![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить код клавиш [D7, XP]
FEV © (2009-04-20 09:42:00)Знаете ли вы какую-нибудь функцию для однозначного определения некого кода клавиш, мне не нужно чего то вроде VK_TAB, мне нужны сами коды, которые подставив можно было бы получить однозначный код клавиши.
Дело в том, что на клавиатуре (Genius KB-16e) имеется несколько доп. клавиш. Мне необходимо их задействовать в отдельной программе. Причем без использования этих глючных дров на клаву... Клавиши и без дров определяются.
Используя функцию:
function GetCharFromVKey(vkey: Word): string;
var
keystate: TKeyboardState;
retcode: Integer;
begin
Win32Check(GetKeyboardState(keystate));
SetLength(Result, 2);
retcode := ToAscii(vkey,
MapVirtualKey(vkey, 0),
keystate, @Result[1],
0);
case retcode of
0: Result := '';
1: SetLength(Result, 1);
2: ;
else
Result := '';
end;
end;
я получаю их отдельную функциональность... НО они работают как одна, т.к. тут выводится ASCII код, а на них его нет. т.е. все клавиши с ASCII кодом ' ' - будут считаться этими клавишами... Т.к у этих клавиш нет аски значения, поэтому они определяются одинаково. Но у каждой клавиши есть, свой уникальный код, вот мне нужна функция для получения этого кода. Любого(двоичного, шестнадцеричного и др.), только уникального! Заранее благодарен.
FEV (2009-04-20 20:48:00) [1]Всё! Я завершил. Может кому пригодится:
Это упрошённый вид.
//KeyHook.dpr
library KeyHook;
uses
shellapi,
windows,
sysutils;
var
g_hhk: HHOOK;
function KeyboardProc(nCode: Integer; wParam: wParam; lParam: lParam ): LParam; stdcall;
begin
Result := CallNextHookEx(g_hhk, nCode, wParam, lParam);
end;
exports
KeyboardProc;
begin
end.
используем где нибудь например:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
hinstDLL: HINST;
hkprcKeyboard: TFNHookProc;
msg,ng: TMsg;
begin
hinstDLL := LoadLibrary('KeyHook.dll');
hkprcKeyboard := GetProcAddress(hinstDLL, 'KeyboardProc');
SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
GetMessage(msg, 0, 0, 0);
edit1.text:=inttostr(msg.message)+' '+inttostr(msg.wParam)+' '+inttostr(msg.lParam));
end;
Таким образом, можно нажимая кнопку, сверять с неким значением, если оно совпадает... Делать что хотим...
FEV (2009-04-20 19:57:00) [2]Итак... В общем пошёл другим путём... Я получил коды нужных клавиш в виде:
nCode,wParam,lParam
через исходник одной dll и вызов ее функции, а именно:
function KeyboardProc(nCode: Integer; wParam: wParam; lParam: lParam ): LParam; stdcall;
var
f:textfile;
begin
MessageBeep(0);
assignfile(f, 'c:\hook.txt');
try append(f); except rewrite(f);
end; writeln(f, nCode,',',wParam,',',lParam);
close(f);
end;
и использование в программе:
procedure TForm1.Button1Click(Sender: TObject);
var
hinstDLL: HINST;
hkprcKeyboard: TFNHookProc;
msg: TMsg;
begin
hinstDLL := LoadLibrary('KeyHook.dll');
hkprcKeyboard := GetProcAddress(hinstDLL, 'KeyboardProc');
SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
end;
Я просто не доезжаю, откуда KeyboardProc() получает эти входные данные... Кажется DLL они не передаются из программы, значит SetWindowsHookEx как-то их передает... А как не доганяю...
Вопрос в том, как мне эту функцию(или измененную) использовать прямо в программе (не используя dll) и результатом получить строку nCode+wParam+lParam??? или хотя бы wParam+lParam...
FEV (2009-04-20 17:56:00) [3]
> easy © (20.04.09 10:07) [1]
> http://dfc.com.ru/?sid=2&id=8&itemid=14
Я там это посмотрел... Но не всё понял.
Я понял что это так:
APPCOMMAND_TREBLE_DOWN = 22;
APPCOMMAND_TREBLE_UP = 23;
FAPPCOMMAND_MOUSE = $8000;
А как исправить:
#define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK))???
#define GET_DEVICE_LPARAM(lParam) ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK))
И есть ли где-нибудь исходник с рабочими этими кодами?
FEV (2009-04-20 10:26:00) [4]Ну если реакция программы на нажатия клавиш есть, значит Windows получает коды какие-то... А раз получает, значит этот код можно получить и мне в Delphi...
То что клавиши работают без дров видно на многих прогах, просто на них нет текстового идентификатора, над чем мне и надо поработать.
palva (2009-04-20 10:12:00) [5]Без драйвера клавиатуры работа Windows невозможна, ИМХО.
Или дрова - это что-то другое на вашем языке?
easy (2009-04-20 10:07:00) [6]http://dfc.com.ru/?sid=2&id=8&itemid=14