Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

Получить код клавиш   Найти похожие ветки 

 
FEV   (2009-04-20 09:42) [0]

Знаете ли вы какую-нибудь функцию для однозначного определения некого кода клавиш, мне не нужно чего то вроде 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 кодом " " - будут считаться этими клавишами... Т.к у этих клавиш нет аски значения, поэтому они определяются одинаково. Но у каждой клавиши есть, свой уникальный код, вот мне нужна функция для получения этого кода. Любого(двоичного, шестнадцеричного и др.), только уникального! Заранее благодарен.


 
easy ©   (2009-04-20 10:07) [1]

http://dfc.com.ru/?sid=2&id=8&itemid=14


 
palva ©   (2009-04-20 10:12) [2]

Без драйвера клавиатуры работа Windows невозможна, ИМХО.
Или дрова - это что-то другое на вашем языке?


 
FEV   (2009-04-20 10:26) [3]

Ну если реакция программы на нажатия клавиш есть, значит Windows получает коды какие-то... А раз получает, значит этот код можно получить и мне в Delphi...
То что клавиши работают без дров видно на многих прогах, просто на них нет текстового идентификатора, над чем мне и надо поработать.


 
FEV   (2009-04-20 17:56) [4]


> 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 19:57) [5]

Итак... В общем пошёл другим путём... Я получил коды нужных клавиш в виде:
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 20:48) [6]

Всё! Я завершил. Может кому пригодится:
Это упрошённый вид.
//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;

Таким образом, можно нажимая кнопку, сверять с неким значением, если оно совпадает... Делать что хотим...



Страницы: 1 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1237877089
{RASkov}
2009-03-24 09:44
2009.05.31
Настройка сетевого принтера


2-1240060370
Student
2009-04-18 17:12
2009.05.31
Нет записи в член класса (вопрос по классическому ООП)


9-1179831261
Jkot
2007-05-22 14:54
2009.05.31
Луч и треугольник.


2-1237214993
Alex354
2009-03-16 17:49
2009.05.31
Печатать изображение без учёта границ непечатаемых полей


2-1239701746
mnj
2009-04-14 13:35
2009.05.31
Распознавание Sender