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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.009 c
14-64339
MVovva
2003-03-04 12:05
2003.03.20
Желающие посмотреть


1-64091
Ork
2003-03-09 11:26
2003.03.20
TRichEdit


3-63988
Ольга
2003-02-26 15:59
2003.03.20
как лучше создавать связанные таблицы


3-63984
dimis
2003-02-28 09:43
2003.03.20
Рисунок в Title


1-64057
Новичек
2003-03-09 17:28
2003.03.20
Проектирование собственного диалога.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский