按钮按下时如何判断键盘的Ctrl或Shift键是否被按住?(100分)

  • 主题发起人 主题发起人 taik
  • 开始时间 开始时间
T

taik

Unregistered / Unconfirmed
GUEST, unregistred user!
按钮按下时如何判断键盘的Ctrl或Shift键是否被按住?
 
在 KeyUp, KeyDown 事件中判断Shift参数:

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.
ssMiddle The middle mouse button is held down.
ssDouble The mouse was double-clicked.

if ssShift in Shift then //Shift key in ShiftState
if ssCtrl in Shift then //Control key in ShiftState
if (ssShift in Shift) and (ssCtrl in Shift) then //Both Ctrl and Shift in
 
您可以在任何时候调用:
GetKeyState(nVirtualKeyCode);
来知道任何键的状态:
返回值是:
一个short integer, 在Delphi中可以认为是Word;
如果最高位是1,则表明键是处于按下的状态,
如果最低位是1,则表示处于激发状态,(例如大小写状态)

常用的键的nVirtualKeyCode值是:
VK_SHIFT: 任何一个Shift键
VK_LSHIFT: 左边的那个
VK_RSHIFT

VK_CONTROL: 任何一个Ctrl键
VK_LCONTROL
VK_RCONTROL

VK_MENU: 任何一个Alt键
VK_LMENU
VK_RMENU
 
Example:
检查左边的那个Shift键盘有没有按下:
if ((GetKeyState(VK_LSHIFT) and &80)<>0) then
Begin
{ Haha, you are pressing the left Shift key, :) }
End
else
Begin
End;
 
Example:
不好意思,刚才哪个例子有点毛病,现在是真正在机器上通过的,:)
检查左边的那个Shift键盘有没有按下:
if ( ( integer(GetKeyState(VK_LSHIFT))
and integer($80)
)
<>0
) then
Begin
{ Haha, you are pressing the left Shift key, :) }
End
else
Begin
End;
 
检测onkeydown和onkeyup都可以!
 
竟然出100分,乱花钱。:)
 
还有MOUSECLICK
 
这种问题,高手不要回答得太快,也让大家多赚点分。。。
$%@#@@#&!@
//xixi
 
不好意思,不过这个问题虽然简单,
我发现huizhang大虾已经答错了,所以
觉得可能别人也很容易这样处理,就赶紧
出手啦!:)

如果您通过检查键盘或者鼠标消息是附加的
各个功能键的状态位信息来判断,是不够准确
的:因为输入焦点不会一直在你的程序上,
如果我在另一个窗口拥有输入焦点的时候按下
Shift键,你的程序不可能知道,其他通过
这类的方法获得键盘状态的方法也有类似的问
题而且只能限于Ctrl, Shift, Alt几个键,
只有用GetKeyState及时检查键盘状态才是
好的解决方法,

各位以为如何?

这个问题的分数是多了一些,不过会者不难,
南者不会,相信taik不会人为不值得吧!

:)
 
; 是我问题中的例子不太准确,所以有些回答针对问题本身也没错。
我是在DBGrid的TitleClick事件中要用Shift和Control扩展下,看了
回答后查了下Button的KeyDown事件,发现对问题来说有些回答也正
确。
Pegaus大虾的代码测了下,发现这句:
if (
(integer(GetKeyState(VK_LSHIFT)) and
integer($80) <>0
) then
还有小问题,换成VK_Shift是可以的,但VK_LShift不行,即左右Shift
区分还有问题,估计是($80)引起的,没再测下去。

今天白天连不上,所以没及时分配分数,既然还有小问题就再拖一
天吧,最迟明天晚上我会分配出分数的。

Btw:觉得easy的可能是被我问题中的Button给误导了,我今天打好了份
WinApi清单,提问题时只查了Delphi函数表。几位有空来VoxPhone聊聊。
 
看来得留点小问题结束了,就此瓜分吧,原因昨天的贴已经提出了。
 
pegasus的说法我不同意, 要判断键盘状态自然是你自己当前接收输入的窗口, 别的
程序是否按下Shift键你也要管, 是否手伸得太长了, 无疑是浪费系统资源.

KeyUp,KeyDown中提供的Shift参数就是干这个事情用的, 怎么能够说我的回答是错
误的呢. 叫你这样给否定了, 这样别人下回谁还敢使用KeyUp,KeyDown中的Shift.

我这里不是对某个人有意见, 就是要把答案搞得尽量准确. 回答的问题一定要负责任,
因为好多人把这个论坛的离线阅读下载回去当作天书来使用.
 
后退
顶部