检测键盘,如何知道按了哪個鍵(可能是單鍵,也可能是組合鍵)(50分)

  • 主题发起人 主题发起人 myveremy
  • 开始时间 开始时间
M

myveremy

Unregistered / Unconfirmed
GUEST, unregistred user!
检测键盘,如何知道按了哪個鍵(可能是單鍵,也可能是組合鍵)

現有一遙控器是利用鍵盤來發觸發事件,我想知道的是按下遙控器的某個按鈕,它對應的鍵盤鍵是怎么????
 
用getasynckeystate函数,比如 if getasynckeystate(vk_escape)<0 then halt;
就是用来判断有没有按ESCAPE键的。

资料:
Virtual Key Codes




{ Virtual Keys, Standard Set }
VK_LBUTTON = 1;
VK_RBUTTON = 2;
VK_CANCEL = 3;
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
VK_BACK = 8;
VK_TAB = 9;
VK_CLEAR = 12;
VK_RETURN = 13;
VK_SHIFT = $10;
VK_CONTROL = 17;
VK_MENU = 18;
VK_PAUSE = 19;
VK_CAPITAL = 20;
VK_KANA = 21;
VK_HANGUL = 21;
VK_JUNJA = 23;
VK_FINAL = 24;
VK_HANJA = 25;
VK_KANJI = 25;
VK_CONVERT = 28;
VK_NONCONVERT = 29;
VK_ACCEPT = 30;
VK_MODECHANGE = 31;
VK_ESCAPE = 27;
VK_SPACE = $20;
VK_PRIOR = 33;
VK_NEXT = 34;
VK_END = 35;
VK_HOME = 36;
VK_LEFT = 37;
VK_UP = 38;
VK_RIGHT = 39;
VK_DOWN = 40;
VK_SELECT = 41;
VK_PRINT = 42;
VK_EXECUTE = 43;
VK_SNAPSHOT = 44;
VK_INSERT = 45;
VK_DELETE = 46;
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
VK_LWIN = 91;
VK_RWIN = 92;
VK_APPS = 93;
VK_NUMPAD0 = 96;
VK_NUMPAD1 = 97;
VK_NUMPAD2 = 98;
VK_NUMPAD3 = 99;
VK_NUMPAD4 = 100;
VK_NUMPAD5 = 101;
VK_NUMPAD6 = 102;
VK_NUMPAD7 = 103;
VK_NUMPAD8 = 104;
VK_NUMPAD9 = 105;
VK_MULTIPLY = 106;
VK_ADD = 107;
VK_SEPARATOR = 108;
VK_SUBTRACT = 109;
VK_DECIMAL = 110;
VK_DIVIDE = 111;
VK_F1 = 112;
VK_F2 = 113;
VK_F3 = 114;
VK_F4 = 115;
VK_F5 = 116;
VK_F6 = 117;
VK_F7 = 118;
VK_F8 = 119;
VK_F9 = 120;
VK_F10 = 121;
VK_F11 = 122;
VK_F12 = 123;
VK_F13 = 124;
VK_F14 = 125;
VK_F15 = 126;
VK_F16 = 127;
VK_F17 = 128;
VK_F18 = 129;
VK_F19 = 130;
VK_F20 = 131;
VK_F21 = 132;
VK_F22 = 133;
VK_F23 = 134;
VK_F24 = 135;
VK_NUMLOCK = 144;
VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
VK_LSHIFT = 160;
VK_RSHIFT = 161;
VK_LCONTROL = 162;
VK_RCONTROL = 163;
VK_LMENU = 164;
VK_RMENU = 165;
VK_PROCESSKEY = 229;
VK_ATTN = 246;
VK_CRSEL = 247;
VK_EXSEL = 248;
VK_EREOF = 249;
VK_PLAY = 250;
VK_ZOOM = 251;
VK_NONAME = 252;
VK_PA1 = 253;
VK_OEM_CLEAR = 254;
 
lmd控件包中有这样一个控件, LMDGlobalHotKey1
应该可以满足你的要求。
当然属于偷懒的做法,控件直接可以获取键盘事件
procedure TForm1.LMDGlobalHotKey1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin

end;
 
算了写也删算了!
你用楼上的也能行,不过上面放个焦点控件,在控件里输入东西就不能接收这个事件了!
这种应该用消息写,那才是全局的!
我写了一个;还有
to weiliu;
你不要回答别人的问题都是粘一片收藏的东西出来,好不!重在解决问题;
 
用HOOK捕捉下来记录既可
如果是组合键就等他按起时记录!
 
to zywcd:
控件直接可以获取键盘事件,但是因为每次遥控器的键不一样,那它出发键盘的键也会不一样,那它出发的时间都一样吗?還有LMDGlobalHotKey1哪里下的到??(給個鏈接)
to 5207:
用HOOK捕捉下来记录既可,是否可以贴个例子出来学习一下。
 
例:getKeyState(vk_shift)<0时按下,>=0时未按下。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
816
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部