Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
2-1239857781
trueTRIx
2009-04-16 08:56
2009.05.31
смещение курсора 2 вопроса


4-1210363535
Цукор5
2008-05-10 00:05
2009.05.31
сер.номер винчестера в Висте


4-1188989858
Cj
2007-09-05 14:57
2009.05.31
Как получить путь к файлу...


8-1194546980
NaRuTo
2007-11-08 21:36
2009.05.31
Как нарисовать кривую в TCanvas


15-1238188551
Petr V. Abramov
2009-03-28 00:15
2009.05.31
Африк Симон Все пройдет, Мария





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский