判断shift,ctrl,alt键是否按下

 在组件的OnKeyDown、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程中,有一个TShiftState类型的变量Shift ,

TShiftState类型定义如下:

1  type  TShiftState  =   set   of  (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

 

所以根据Shift的值就可以判断当键盘上的键按下时Shift 、Alt和Ctrl键的状态,或者按下鼠标左键、鼠标右键、鼠标中键、任意按键双击时的状态。

下面的例程说明了如何检测Shift、Alt和Ctrl 键是否按下。 
    

通过菜单File | New Application 创建一个新的工程,在窗体中添加一个StatusBar组件,并在状态栏编辑器中为其添加6 个面板。

然后为窗体Form1添加OnKeyDown 、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程如下:

 

OnKeyDown事件:

 1  procedure  TForm1.FormKeyDown(Sender: TObject;  var  Key: Word; Shift: TShiftState); 
 2  begin  
 3     if  Shift >= [ssShift]  then    { 如果按下了Shift键则在第一个面板上显示Shift }
 4      StatusBar1.Panels[ 0 ].Text: =   ' Shift '
 5 
 6     if  Shift >= [ssAlt]  then   { 如果按下了Alt键则在第二个面板上显示Alt }  
 7      StatusBar1.Panels[ 1 ].Text: =   ' Alt '
 8 
 9     if  Shift >= [ssCtrl]  then   { 如果按下了C t r l 键则在第三个面板上显示Ctrl }
10      StatusBar1.Panels[ 2 ].Text: =   ' Ctrl '
11 
12  end ;

 

 

OnKeyUp事件:
 1  procedure  TForm1.FormKeyUp(Sender: TObject;  var  Key: Word; Shift: TShiftState); 
 2  begin   
 3  { 在Shift、Alt 和Ctrl键弹起时清除状态栏中相应面板上的内容  }
 4     if   not (Shift >= [ssShift])  then  
 5      StatusBar1.Panels[ 0 ].Text: = '   '
 6 
 7     if   not (Shift >= [ssAlt])  then  
 8      StatusBar1.Panels[ 1 ].Text: = '   '
 9 
10     if   not (Shift >= [ssCtrl])  then  
11      StatusBar1.Panels[ 2 ].Text: = '   '
12  end ;
13 

 

 


OnMouseDown事件:

 1  procedure  TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); 
 2  begin  
 3 
 4     if  Shift >= [ssLeft]  then    { 按下了左键则在第四个面板上显示left }
 5      Statusbar1.Panels[ 3 ].Text: =   ' left '
 6 
 7     if  Shift >= [ssMiddle]  then   { 如果按下了中键则在第五个面板上显示Middle }
 8      StatusBar1.Panels[ 4 ].Text: =   ' Middle '
 9 
10     if  Shift >= [ssDouble]  then   { 如果是双击则在第六个面板上显示Double  }
11      StatusBar1.Panels[ 5 ].Text: = ' Double '
12  end
13 

 

 

OnMouseUp事件:

 1  procedure  TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); 
 2  begin  
 3  { 在鼠标按键弹起时清除状态栏中相应面板上的内容  }
 4     if   not (Shift >= [ssLeft])  then   
 5      StatusBar1.Panels[ 3 ].Text: = '   '
 6 
 7     if   not (Shift >= [ssMiddle])  then  
 8      StatusBar1.Panels[ 4 ].Text: = '   '
 9 
10     if   not (Shift >= [ssDouble])  then  
11      StatusBar1.Panels[ 5 ].Text: = '   '
12  end

 

程序运行后,读者可以尝试按下Shift、Alt 和Ctrl键,单击或双击鼠标左键、中键和右键,观察状态栏上各面板的显示。

 

 

{★推荐:网购拿返利,购物新选择}

转载于:https://www.cnblogs.com/dabiao/archive/2010/02/07/1665533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值