Shift 是一个集合变量。
type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
也就是说TShiftstate类型有ssShift, ssAlt, ssCtrl, ssLeft(鼠标左键), ssRight(鼠标右键), ssMiddle(鼠标中键), ssDouble (鼠标双击)
Value Meaning
ssShift
ssAlt
ssCtrl
ssLeft
ssRight
ssMiddle
ssDouble
用来判断组合键中是否用shift、Ctrl、鼠标左键、右键、中键、双击事件。
Delphi中一些常用的组合键值
CTRL+A:#1 CTRL+B:#2 CTRL+C:#3 CTRL+D:#4 CTRL+E:#5 CTRL+F:#6 CTRL+G:#7
CTRL+H:#8 CTRL+I:#9 CTRL+J:#10 CTRL+K:#11 CTRL+L:#12 CR:#13 CTRL+N:#14
CTRL+O:#15 CTRL+P:#16 CTRL+Q:#17 CTRL+R:#18 CTRL+S:#19 CTRL+T:#20
CTRL+U:#21 CTRL+V:#22 CTRL+W:#23 CTRL+X:#24 CTRL+Y:#25 CTRL+Z:#26 ESC:#27
CTRL+:#28 CTRL+]:#29 SHIFT+CTRL+-:#30 DEL:#127
一般用在keydown、keyup、keypress事件中。
OnKeyDown和OnKeyUp事件中的Key是Word型的,表示用户按的是键盘上的哪个键,OnKeyPress中的Key是Char型,表示用户输入什么字符。一个产生8位(char)常规健值,一个产生16位(word)功能健健值。
1.KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符,KeyDown和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)
2.KeyPress 只能捕获单个字符
KeyDown 和KeyUp 可以捕获组合键。
3.KeyPress 可以捕获单个字符的大小写
4.KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。
5.KeyPress 不区分小键盘和主键盘的数字字符。
KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。
6.其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。
keydown是键盘按下任何键
keypress是键盘按下任何数字键和任何字母键
keydown
1
type
property
该事件在有任何键按下的时候,就发生。看!它响应的是Word类型,还能识别Shift键状态
2
type
property
该事件响应的是字符类型Char,只能识别ASCII码,不能识别组合键和控制键和功能键。按下功能键、控制键不产生该事件,但产生OnkeyDown事件。
TWinControl与键盘相关的3个事件如下:
OnKeyDown:键按下
OnKeyPress:有Ascii字符产生
OnKeyUp:键放开
其中OnKeyDown、OnKeyUp对任何按键都有响应,传入参数为
var
OnKeyPress事件只对Ascii有响应,传入参数为
var
//例如F1-F10只有onKeydown有反应
另外TWincontrol.
比如说enter键,
onkeypress事件
if
do
onkeydown事件
if
do
其中所有的KeyDown事件里面应该用如下判断:
if Key = VK_RETURN then
...
所有的KeyPress事件里面应该用如下判断:
if Key = #13 then
...
postmessage(self.handle,wm_keydown,vk_tab,0);
keybd_event(VK_TAB,2,0,0);
perform(WM_NEXTDLGCTL,0,0);
SelectNext(ActiveControl, True, True);
...
但是显然用回车代码TAB显然不适合于BUTTON,你在它上面按回车的时候它会执行OnClick,所以不会TAB,你可以用别的键代替回车。
》》》》》》》》》》
键值
在keydown事件里面
showmessage(inttostr(key));
在keypress事件里面
showmessage(key);
就知道了。
Form1.KeyPreview := True;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Showmessage(IntToStr(Key));
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Showmessage(IntToStr(Ord(Key)));
end;
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = 1;
{$EXTERNALSYM VK_RBUTTON}
VK_RBUTTON = 2;
{$EXTERNALSYM VK_CANCEL}
VK_CANCEL = 3;
{$EXTERNALSYM VK_MBUTTON}
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
{$EXTERNALSYM VK_BACK}
VK_BACK = 8;
{$EXTERNALSYM VK_TAB}
VK_TAB = 9;
{$EXTERNALSYM VK_CLEAR}
VK_CLEAR = 12;
{$EXTERNALSYM VK_RETURN}
VK_RETURN = 13;
{$EXTERNALSYM VK_SHIFT}
VK_SHIFT = $10;
{$EXTERNALSYM VK_CONTROL}
VK_CONTROL = 17;
{$EXTERNALSYM VK_MENU}
VK_MENU = 18;
{$EXTERNALSYM VK_PAUSE}
VK_PAUSE = 19;
{$EXTERNALSYM VK_CAPITAL}
VK_CAPITAL = 20;
{$EXTERNALSYM VK_KANA }
VK_KANA = 21;
{$EXTERNALSYM VK_HANGUL }
VK_HANGUL = 21;
{$EXTERNALSYM VK_JUNJA }
VK_JUNJA = 23;
{$EXTERNALSYM VK_FINAL }
VK_FINAL = 24;
{$EXTERNALSYM VK_HANJA }
VK_HANJA = 25;
{$EXTERNALSYM VK_KANJI }
VK_KANJI = 25;
{$EXTERNALSYM VK_CONVERT }
VK_CONVERT = 28;
{$EXTERNALSYM VK_NONCONVERT }
VK_NONCONVERT = 29;
{$EXTERNALSYM VK_ACCEPT }
VK_ACCEPT = 30;
{$EXTERNALSYM VK_MODECHANGE }
VK_MODECHANGE = 31;
{$EXTERNALSYM VK_ESCAPE}
VK_ESCAPE = 27;
{$EXTERNALSYM VK_SPACE}
VK_SPACE = $20;
{$EXTERNALSYM VK_PRIOR}
VK_PRIOR = 33;
{$EXTERNALSYM VK_NEXT}
VK_NEXT = 34;
{$EXTERNALSYM VK_END}
VK_END = 35;
{$EXTERNALSYM VK_HOME}
VK_HOME = 36;
{$EXTERNALSYM VK_LEFT}
VK_LEFT = 37;
{$EXTERNALSYM VK_UP}
VK_UP = 38;
{$EXTERNALSYM VK_RIGHT}
VK_RIGHT = 39;
{$EXTERNALSYM VK_DOWN}
VK_DOWN = 40;
{$EXTERNALSYM VK_SELECT}
VK_SELECT = 41;
{$EXTERNALSYM VK_PRINT}
VK_PRINT = 42;
{$EXTERNALSYM VK_EXECUTE}
VK_EXECUTE = 43;
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = 44;
{$EXTERNALSYM VK_INSERT}
VK_INSERT = 45;
{$EXTERNALSYM VK_DELETE}
VK_DELETE = 46;
{$EXTERNALSYM VK_HELP}
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) }
{$EXTERNALSYM VK_LWIN}
VK_LWIN = 91;
{$EXTERNALSYM VK_RWIN}
VK_RWIN = 92;
{$EXTERNALSYM VK_APPS}
VK_APPS = 93;
{$EXTERNALSYM VK_NUMPAD0}
VK_NUMPAD0 = 96;
{$EXTERNALSYM VK_NUMPAD1}
VK_NUMPAD1 = 97;
{$EXTERNALSYM VK_NUMPAD2}
VK_NUMPAD2 = 98;
{$EXTERNALSYM VK_NUMPAD3}
VK_NUMPAD3 = 99;
{$EXTERNALSYM VK_NUMPAD4}
VK_NUMPAD4 = 100;
{$EXTERNALSYM VK_NUMPAD5}
VK_NUMPAD5 = 101;
{$EXTERNALSYM VK_NUMPAD6}
VK_NUMPAD6 = 102;
{$EXTERNALSYM VK_NUMPAD7}
VK_NUMPAD7 = 103;
{$EXTERNALSYM VK_NUMPAD8}
VK_NUMPAD8 = 104;
{$EXTERNALSYM VK_NUMPAD9}
VK_NUMPAD9 = 105;
{$EXTERNALSYM VK_MULTIPLY}
VK_MULTIPLY = 106;
{$EXTERNALSYM VK_ADD}
VK_ADD = 107;
{$EXTERNALSYM VK_SEPARATOR}
VK_SEPARATOR = 108;
{$EXTERNALSYM VK_SUBTRACT}
VK_SUBTRACT = 109;
{$EXTERNALSYM VK_DECIMAL}
VK_DECIMAL = 110;
{$EXTERNALSYM VK_DIVIDE}
VK_DIVIDE = 111;
{$EXTERNALSYM VK_F1}
VK_F1 = 112;
{$EXTERNALSYM VK_F2}
VK_F2 = 113;
{$EXTERNALSYM VK_F3}
VK_F3 = 114;
{$EXTERNALSYM VK_F4}
VK_F4 = 115;
{$EXTERNALSYM VK_F5}
VK_F5 = 116;
{$EXTERNALSYM VK_F6}
VK_F6 = 117;
{$EXTERNALSYM VK_F7}
VK_F7 = 118;
{$EXTERNALSYM VK_F8}
VK_F8 = 119;
{$EXTERNALSYM VK_F9}
VK_F9 = 120;
{$EXTERNALSYM VK_F10}
VK_F10 = 121;
{$EXTERNALSYM VK_F11}
VK_F11 = 122;
{$EXTERNALSYM VK_F12}
VK_F12 = 123;
{$EXTERNALSYM VK_F13}
VK_F13 = 124;
{$EXTERNALSYM VK_F14}
VK_F14 = 125;
{$EXTERNALSYM VK_F15}
VK_F15 = 126;
{$EXTERNALSYM VK_F16}
VK_F16 = 127;
{$EXTERNALSYM VK_F17}
VK_F17 = 128;
{$EXTERNALSYM VK_F18}
VK_F18 = 129;
{$EXTERNALSYM VK_F19}
VK_F19 = 130;
{$EXTERNALSYM VK_F20}
VK_F20 = 131;
{$EXTERNALSYM VK_F21}
VK_F21 = 132;
{$EXTERNALSYM VK_F22}
VK_F22 = 133;
{$EXTERNALSYM VK_F23}
VK_F23 = 134;
{$EXTERNALSYM VK_F24}
VK_F24 = 135;
{$EXTERNALSYM VK_NUMLOCK}
VK_NUMLOCK = 144;
{$EXTERNALSYM VK_SCROLL}
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. }
{$EXTERNALSYM VK_LSHIFT}
VK_LSHIFT = 160;
{$EXTERNALSYM VK_RSHIFT}
VK_RSHIFT = 161;
{$EXTERNALSYM VK_LCONTROL}
VK_LCONTROL = 162;
{$EXTERNALSYM VK_RCONTROL}
VK_RCONTROL = 163;
{$EXTERNALSYM VK_LMENU}
VK_LMENU = 164;
{$EXTERNALSYM VK_RMENU}
VK_RMENU = 165;
{$EXTERNALSYM VK_PROCESSKEY}
VK_PROCESSKEY = 229;
{$EXTERNALSYM VK_ATTN}
VK_ATTN = 246;
{$EXTERNALSYM VK_CRSEL}
VK_CRSEL = 247;
{$EXTERNALSYM VK_EXSEL}
VK_EXSEL = 248;
{$EXTERNALSYM VK_EREOF}
VK_EREOF = 249;
{$EXTERNALSYM VK_PLAY}
VK_PLAY = 250;
{$EXTERNALSYM VK_ZOOM}
VK_ZOOM = 251;
{$EXTERNALSYM VK_NONAME}
VK_NONAME = 252;
{$EXTERNALSYM VK_PA1}
VK_PA1 = 253;
{$EXTERNALSYM VK_OEM_CLEAR}
VK_OEM_CLEAR = 254;
:),其实不用记,你不是用delphi吗,在ide里面输入vk_f1总会吧,然后按住ctrl键
单击刚才你输入的vk_f1,就会出来啦!
至于key:char的值,就是key:word的ascII码,你可以看chr(vk_f1),chr(vk_enter),都可以哈!
》》》》》》》》》》》》》》》》》》
delphi帮助里的虚拟键值表:
vk_right right arrow key
vk_down down arrow key
vk_select select key
vk_print print key (keyboard-specific)
vk_execute execute key
vk_snapshot print screen key
vk_insert insert key
vk_delete delete key
vk_help help key
vk_lwin left windows key (microsoft keyboard)
vk_rwin right windows key (microsoft keyboard)
vk_apps applications key (microsoft keyboard)
vk_numpad0 0 key (numeric keypad)
vk_numpad1 1 key (numeric keypad)
vk_numpad2 2 key (numeric keypad)
vk_numpad3 3 key (numeric keypad)
vk_numpad4 4 key (numeric keypad)
vk_numpad5 5 key (numeric keypad)
vk_numpad6 6 key (numeric keypad)
vk_numpad7 7 key (numeric keypad)
vk_numpad8 8 key (numeric keypad)
vk_numpad9 9 key (numeric keypad)
vk_multiply multiply key (numeric keypad)
vk_add add key (numeric keypad)
vk_separator separator key (numeric keypad)
vk_subtract subtract key (numeric keypad)
vk_decimal decimal key (numeric keypad)
vk_divide divide key (numeric keypad)
vk_f1 f1 key
vk_f2 f2 key
vk_f3 f3 key
vk_f4 f4 key
vk_f5 f5 key
vk_f6 f6 key
vk_f7 f7 key
vk_f8 f8 key
vk_f9 f9 key
vk_f10 f10 key
vk_f11 f11 key
vk_f12 f12 key
vk_f13 f13 key
vk_f14 f14 key
vk_f15 f15 key
vk_f16 f16 key
vk_f17 f17 key
vk_f18 f18 key
vk_f19 f19 key
vk_f20 f20 key
vk_f21 f21 key
vk_f22 f22 key
vk_f23 f23 key
vk_f24 f24 key
vk_numlock num lock key
vk_scroll scroll lock key
vk_lshift left shift key (only used with getasynckeystate and getkeystate)
vk_rshift right shift key (only used with getasynckeystate and getkeystate)
vk_lcontrol left ctrl key (only used with getasynckeystate and getkeystate)
vk_rcontrol right ctrl key (only used with getasynckeystate and getkeystate)
vk_lmenu left alt key (only used with getasynckeystate and getkeystate)
vk_rmenu right alt key (only used with getasynckeystate and getkeystate)
vk_processkey process key
vk_attn attn key
vk_crsel crsel key
vk_exsel exsel key
vk_ereof erase eof key
vk_play play key
vk_zoom zoom key
vk_noname reserved for future use
vk_pa1 pa1 key
vk_oem_clear clear key
模拟鼠标
鼠标移动(移动量dx,dy)
mouse_event(MOUSEEVENTF_MOVE,dx,dy,0, 0 );
鼠标在(x,y)处按下或释放
setcursorpos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 );
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 );
鼠标双击由两次按下与释放来模拟
键盘模拟
一般虚拟键值(VK_)由KeyDown或keyup事件得到
特殊键值
Tab--9
Shift--16
Ctrl--17
Alt--18
CapsLock--20
Esc--27
Win--91,92
NumLock--144
ScrollLock--145
按下键
keybd_event(key, MapVirtualKey(key, 0 ), KEYEVENTF_KEYUP , 0 );
释放键
keybd_event(key, MapVirtualKey(key, 0 ), 0 , 0 );
以上做法对大多数键有效,少数键要用到不同的值
》》》》》》》》》》》》》》》》》》》》》》》》》
常数名称
VK_LBUTTON
VK_RBUTTON
VK-CANCEL
VK_MBUTTON
VK_BACK
VK_TAB
VK_CLEAR
VK_RETURN
VK_SHIFT
VK_CONTROL
VK_MENU
VK_PAUSE
VK_CAPITAL
VK_ESCAPE
VK_SPACE
VK_PRIOR
VK_NEXT
VK_END
VK_HOME
VK_LEFT
VK_UP
VK_RIGHT
VK_DOWN
VK_Select
VK_PRINT
VK_EXECUTE
VK_SNAPSHOT
VK_Insert
VK_Delete
VK_HELP
VK_0
VK_1
VK_2
VK_3
VK_4
VK_5
VK_6
VK_7
VK_8
VK_9
VK_A
VK_B
VK_C
VK_D
VK_E
VK_F
VK_G
VK_H
VK_I
VK_J
VK_K
VK_L
VK_M
VK_N
VK_O
VK_P
VK_Q
VK_R
VK_S
VK_T
VK_U
VK_V
VK_W
VK_X
VK_Y
VK_Z
VK_NUMPAD0
VK_NUMPAD1
VK_NUMPAD2
VK_NUMPAD3
VK_NUMPAD4
VK_NUMPAD5
VK_NUMPAD6
VK_NUMPAD7
VK_NUMPAD8
VK_NUMPAD9
VK_MULTIPLY
VK_ADD
VK_SEPARATOR
VK_SUBTRACT
VK_DECIMAL
VK_DIVIDE
VK_F1
VK_F2
VK_F3
VK_F4
VK_F5
VK_F6
VK_F7
VK_F8
VK_F9
VK_F10
VK_F11
VK_F12
VK_NUMLOCK
VK_SCROLL
上面没有提到的:(都在大键盘)
VK_LWIN
VK_RWIN
VK_APPS
procedure
begin
end;
Delphi6.0,2000下通过Top
于在keydown中屏蔽掉除数字外的所有键
还应该允许Ctr+C/X/V,所以总结起来应该是:
begin
end;
procedure
begin