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

Вниз

Как отловить мультимедийные клавиши на клаве?   Найти похожие ветки 

 
maxfiles   (2003-01-22 01:19) [0]

У меня клавиатура - мультимедийная и в дельфи незнаю, как отловить такие кнопки. Обычные VK_ не подходят...

Как быть? Спасибо


 
Nick_N_A ©   (2003-01-22 06:17) [1]

А генерируют ли эти клавиши вобще wm_syskeydown?
Там-же и их код.

Самый плохой способ:
function GetScanCode:byte; assembler;
asm
mov dx,$60;
in al,dx;
end;


пока не подводил, но при нажатии нескольких клавиш одновременно,
он не все успевает принять



 
MegaBass ©   (2003-01-22 11:19) [2]

GetKeyboardState + F1


 
Tano ©   (2003-01-22 19:59) [3]

Я бы написал маленькую прогу с Memo на форме и в обработчике
TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
выводил бы код Key в Memo
Memo1.Lines.Append(IntToStr(Key))
и аккуратно записал бы на бумажечку соответствия :-)
или нибил бы свой дополнительный набор констант VK_???
У меня клава типичная и кроме Sleep и Power ничего необычного нет - попробовать не на чем.
Если получиться - нипиши.


 
maxfiles   (2003-01-23 00:08) [4]

Нет! Я такое уже пробовал :) поэтому и обращаюсь! Так просто эти кнопочки не считываются. А хотелось бы...

Есть еще предложения???

На asm - в виндах 2000 может не работать :(


 
S.P.I.R.I.T ©   (2003-01-23 02:21) [5]

У меня была такая же проблема вот что у меня получилось но она глючит а доделать времени нет



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{Public declarations }
end;

var
Form1: TForm1;
HookHandle: hHook;

implementation

{$R *.dfm}
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
key,i,volume: integer;
begin
if Code >= 0 then
begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
{ WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
WM_LBUTTONDOWN: CheckBox1.Checked := true;
WM_LBUTTONUP: CheckBox1.Checked := false;
WM_RBUTTONDOWN: CheckBox2.Checked := true;
WM_RBUTTONUP: CheckBox2.Checked := false;
WM_MBUTTONDOWN: CheckBox4.Checked := true;
WM_MBUTTONUP: CheckBox4.Checked := false;
WM_KEYUP: CheckBox3.Checked := false;
} WM_KEYDOWN: begin
Form1.caption := msg.paramL;//
end;

end;
end
else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle > 0 then
UnhookWindowsHookEx(HookHandle);
ws.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;

end.


 
PGM   (2003-01-23 14:56) [6]

Надо только другой перехватчик
Под NT/2K/XP отлично все ловится на WH_KEYBOARD_LL в отдельной DLL. Под 9х что-то тоже есть.
У меня Genius (кажется KM18)все клавиши отлично ловятся.


 
maxfiles   (2003-01-24 00:06) [7]

PGM, ты не мог бы по подробнее и желательно с примером?
Заранее спасибо.


 
Pirat ©   (2003-01-24 05:50) [8]

У меня Sven Internet 650(клава) и win2000
все отлично ловится по wm_keydown, по карйней мере перехватчик (которого я попутно написал) показывает что у всех кнопок разные скан-коды.


 
PGM   (2003-01-24 12:18) [9]

Про перехватчики уже столько написано, что не хотелось бы повторяться. Посмотри FAQ, поищи в MSDN. Ключевые вещи:

В DLL
...
HookHandleKBD := SetWindowsHookEx(WH_KEYBOARD_LL,@Msg_HookLLKBD, hInstance,0);
...
UnhookWindowsHookEx(HookHandleKBD);
...

function Msg_HookLLKBD(Code : Integer; wParam : DWORD; lParam : DWORD) : LongInt; stdcall;
var
cds : TCOPYDATASTRUCT;
ckbd : PKBDLLHOOKSTRUCT;
...
ckbd := PKBDLLHOOKSTRUCT(lparam);

skbd.kbdMsg := wParam;
skbd.vkCode := ckbd.vkCode;
skbd.scanCode := ckbd.scanCode;
skbd.flags := ckbd.flags;

cds.dwData := PGM_HOOK_KBD;
cds.cbData := SizeOf(skbd);
cds.lpData := @skbd;

SendMessage(FindWindow(PGMHookClass,nil),WM_COPYDATA,0,Integer(@cds));

В программе, которая будет получать сообщения

procedure OnCopyData(var M : TMessage); message WM_COPYDATA;

procedure TPGMKBDHOOKFORM.OnCopyData(var M : TMessage);
var cds : TCOPYDATASTRUCT;
begin
cds := TCOPYDATASTRUCT(Pointer(M.lparam)^);
...
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.018 c
14-64295
Dimka Maslov
2003-03-06 14:51
2003.03.20
A War for Peace


14-64286
Supreme 2
2003-03-06 01:52
2003.03.20
Передача


1-64075
ДмирийК
2003-03-07 08:59
2003.03.20
Размер exe файла.


3-63976
cherox
2003-02-27 12:24
2003.03.20
TADOQuery


14-64388
bom
2003-03-05 21:48
2003.03.20
Создание программой своей копии