delphi key

本文详细介绍了Delphi中TShiftState类型及其在键盘事件如KeyDown、KeyPress和KeyUp中的应用。讲解了各种键的状态表示,如Shift、Ctrl、鼠标按键等,并对比了KeyDown和KeyPress事件的区别。此外,还列举了常见的虚拟键值,如F1-F24、方向键、功能键等,以及如何模拟鼠标和键盘操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shift 是一个集合变量。
         Type

               TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight,ssMiddle, ssDouble);
也就是说TShiftstate类型有ssShift, ssAlt, ssCtrl, ssLeft(鼠标左键),ssRight(鼠标右键), ssMiddle(鼠标中键), ssDouble (鼠标双击)

Value Meaning
ssShift 
             The Shift key is held down.
ssAlt 
                The Alt key is held down.
ssCtrl 
              The Ctrl key is held down.
ssLeft 
              The left mouse button is held down.
ssRight 
           The right mouse button is held down.
ssMiddle 
          The middle mouse button is held down.
ssDouble 
        The mouse was double-clicked.

用来判断组合键中是否用shift、Ctrl、鼠标左键、右键、中键、双击事件

一般用在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 与keypress的声明格式差别很大

onkeydown事件
type 
TKeyEvent   procedure  (Sender:  TObject;  var  Key:  Word;  Shift:  TShiftState)  of   object;
property 
 OnKeyDown:  TKeyEvent;
该事件在有任何键按下的时候,就发生。看!它响应的是Word类型,还能识别Shift键状态
onkeypress事件
type 
 TKeyPressEvent   procedure  (Sender:  TObject;  var  Key:  Char)  of   object;
property 
 OnKeyPress:  TKeyPressEvent;
该事件响应的是字符类型Char,只能识别ASCII码,不能识别组合键和控制键和功能键。按下功能键、控制键不产生该事件,但产生OnkeyDown事件。

 

TWinControl与键盘相关的3个事件如下:
OnKeyDown:键按下
OnKeyPress:有Ascii字符产生
OnKeyUp:键放开

其中OnKeyDown、OnKeyUp对任何按键都有响应,传入参数为
var 
 Key:   Word键的扫描值
 
  Shift:  TShiftState 表示控制键状态,包括键盘上的Ctrl、Shift、Alt和鼠标的左、中、右键及双击。
 

OnKeyPress事件只对Ascii有响应,传入参数为
var 
 Key:   CharAscii字符
//例如F1-F10只有onKeydown有反应

另外TWincontrol.  KeyPreview:Boolean属性确定控件是否在子控件之前处理按键。

 

比如说enter键,
onkeypress事件

if key=#13  then   //当你按下enter键时触发该事件
do 
 something

 
onkeydown事件
if 
 key=13 then    //当你按下enter键时触发该事件
do 
something

 

 

其中所有的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 virtualkeys.
Used only as parameters to GetAsyncKeyState() andGetKeyState().
No other API or message will distinguish left and right keys inthis 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 andgetkeystate)
vk_rshift right shift key (only used with getasynckeystate andgetkeystate)
vk_lcontrol left ctrl key (only used with getasynckeystate andgetkeystate)
vk_rcontrol right ctrl key (only used with getasynckeystate andgetkeystate)

vk_lmenu left alt key (only used with getasynckeystate andgetkeystate)
vk_rmenu right alt key (only used with getasynckeystate andgetkeystate)
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 
        01               鼠标的左键
VK_RBUTTON 
        02               鼠标的右键
VK-CANCEL 
         03               Ctrl+Break(通常不需要处理)
VK_MBUTTON 
        04               鼠标的中键(三按键鼠标)
VK_BACK 
           08               Backspace键
VK_TAB 
            09               Tab键
VK_CLEAR 
          0C         12      Clear键(Num Lock关闭时的数字键盘5)
VK_RETURN 
         0D         13      Enter键
VK_SHIFT 
          10         16      Shift键
VK_CONTROL 
        11         17      Ctrl键
VK_MENU 
           12         18      Alt键
VK_PAUSE 
          13         19      Pause键
VK_CAPITAL 
        14         20      Caps Lock键
VK_ESCAPE 
         1B         27     Ese键
VK_SPACE 
          20         32      Spacebar键
VK_PRIOR 
          21         33      Page Up键
VK_NEXT 
           22         34      Page Domw键
VK_END 
            23         35      End键
VK_HOME 
           24         36      Home键
VK_LEFT 
           25         37      LEFT ARROW 键(←)
VK_UP 
             26         38      UP ARROW键(↑)
VK_RIGHT 
          27         39      RIGHT ARROW键(→)
VK_DOWN 
           28         40      DOWN ARROW键(↓)
VK_Select 
         29         41      Select键
VK_PRINT 
          2A         42     
VK_EXECUTE 
        2B         43      EXECUTE键
VK_SNAPSHOT 
       2C         44      Print Screen键(抓屏)
VK_Insert 
         2D         45      Ins键(Num Lock关闭时的数字键盘0)
VK_Delete 
         2E         46      Del键(Num Lock关闭时的数字键盘.)
VK_HELP 
           2F         47      Help键
VK_0 
  30         48      0键
VK_1 
  31         49      1键
VK_2 
  32         50      2键
VK_3 
  33         51      3键
VK_4 
  34         52      4键
VK_5 
  35         53      5键
VK_6 
  36         54      6键
VK_7 
  37         55      7键
VK_8 
  38         56      8键
VK_9 
  39         57      9键
VK_A 
  41         65      A键
VK_B 
  42         66      B键
VK_C 
  43         67      C键
VK_D 
  44         68      D键
VK_E 
  45         69      E键
VK_F 
  46         70      F键
VK_G 
  47         71      G键
VK_H 
  48         72      H键
VK_I 
  49         73      I键
VK_J 
  4A         74      J键
VK_K 
  4B         75      K键
VK_L 
  4C         76      L键
VK_M 
  4D         77      M键
VK_N 
  4E         78      N键
VK_O 
  4F         79      O键
VK_P 
  50         80      P键
VK_Q 
  51         81      Q键
VK_R 
  52         82      R键
VK_S 
  53         83      S键
VK_T 
  54         84      T键
VK_U 
  55         85      U键
VK_V 
  56         86      V键
VK_W 
  57         87      W键
VK_X 
  58         88      X键
VK_Y 
  59         89      Y键
VK_Z 
  5A         90      Z键

VK_NUMPAD0         60         96      数字键0键
VK_NUMPAD1 
        61         97      数字键1键
VK_NUMPAD2 
        62         98      数字键2键
VK_NUMPAD3 
        62         99      数字键3键
VK_NUMPAD4 
        64         100     数字键4键
VK_NUMPAD5 
        65         101     数字键5键
VK_NUMPAD6 
        66         102     数字键6键
VK_NUMPAD7 
        67         103     数字键7键
VK_NUMPAD8 
        68         104     数字键8键
VK_NUMPAD9 
        69         105     数字键9键
VK_MULTIPLY 
       6A         106     数字键盘上的*键
VK_ADD 
            6B         107     数字键盘上的+键
VK_SEPARATOR 
      6C         108     Separator键
VK_SUBTRACT 
       6D         109     数字键盘上的-键
VK_DECIMAL 
        6E         110     数字键盘上的.键
VK_DIVIDE 
         6F         111     数字键盘上的/键
VK_F1 
 70         112     F1键
VK_F2 
 71         113     F2键
VK_F3 
 72         114     F3键
VK_F4 
 73         115     F4键
VK_F5 
 74         116     F5键
VK_F6 
 75         117     F6键
VK_F7 
 76         118     F7键
VK_F8 
 77         119     F8键
VK_F9 
 78         120     F9键
VK_F10 
79         121     F10键
VK_F11 
7A         122     F11键
VK_F12 
7B         123     F12键
VK_NUMLOCK 
   90         144     Num Lock 键
VK_SCROLL 
    91         145     Scroll Lock键
 
 

上面没有提到的:(都在大键盘)       
VK_LWIN 
          91      左win键
VK_RWIN 
          92      右win键
VK_APPS 
          93      右Ctrl左边键,点击相当于点击鼠标右键,会弹出快捷菜单
 
      186     ;(分号)
 
      187     =键
 
      188     ,键(逗号)
 
      189     -键(减号)
 
      190     .键(句号)
 
      191     /键
 
      192     `键(Esc下面)
 
      219     [键
 
      220     /键
 
      221     ]键
 
      222     '键(引号)

procedure  TForm1.Edit1KeyDown(Sender:  TObject;  var  Key:  Word; 
 
    Shift:  TShiftState); 
begin 

 
    if  key=VK_DELETE  then 
 
      key:=0; 
end; 

Delphi6.0,2000下通过Top
于在keydown中屏蔽掉除数字外的所有键
还应该允许Ctr+C/X/V,所以总结起来应该是: 

    procedure  TForm1.Edit1KeyPress(Sender:  TObject;  var  Key:  Char); 
begin 

 
   if  not  (Key  in  ['0'..'9',  #3,  #22,  #24,  #8,  #13,  #45])  then  Key  :=  #0; 
end; 
       

procedure  TForm1.Edit1KeyPress(Sender:  TObject;  var  Key:  Char); 
begin 

 
    if  (key>#57)  and   (key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值