vb怎样表示“长按”某个键,如ESC退出键?

长按就是按的时间比一般按键时间稍微长些。

'窗体获得焦点才有效,如果无焦点可以使用api函数,自己修改
Option Explicit
Const settime = 1 '这里设置延迟1s
Dim keyup As Boolean, keydown As Boolean
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 And Not keydown Then
keyup = False
keydown = True
delaymessage
End If
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then
keyup = True
keydown = False
End If
End Sub

Function delaymessage()
Dim t, flag As Boolean
t = Timer
Do
If keyup Then Exit Do '未到时间放掉Esc键
If Timer - t >= settime Then
flag = True
Exit Do
End If
DoEvents
Loop
If flag Then
Print "时间已到:" & settime '可以用msgbox,但由于长安esc后msgbox显示后马上又消失,这里只是一个功能,给你用print做显示
flag = False
End If
End Function追问

请写出无焦点情况下(程序隐藏或最小化运行)的代码。

追答

无米无诚信,哈哈哈,连5毛都没有你还好意思问呀,我这个回答都不止5毛

追问

先加20,诚心诚意

追答

’20毛少了一点,随便给你写点,长安ESC 1s后打印时间,这里你可以改成调用过程或函数
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Dim i As Long, t, j As Integer
If GetAsyncKeyState(27) = 0
If Timer - t > 1 Then Exit Do
DoEvents
Loop
If GetAsyncKeyState(27) < 0 Then Debug.Print "Esc"
End If
End Sub

追问

请写个真正好用的.我看情况再加分,可以加到最高分值.分不是问题.前面有个回答,把长按与短按相混淆,长按也可,短按两三次也相当于长按,影响了短按的功用.短按还有其他用途.

再解释一下:我说的长按是按下去的时间稍微长些,

追答

'长安短按都给你写了,如果再看不懂我也就认输了,时间自己设置
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Dim i As Long, t, j As Integer
Static flag As Boolean
If GetAsyncKeyState(27) 0.5‘0.5s之内作为短按
DoEvents
Loop
If Not flag Then
flag = True
If GetAsyncKeyState(27) >= 0 Then '如果esc已经放开按短按处理
Debug.Print "短按功能"
Exit Sub
End If
Do Until GetAsyncKeyState(27) >= 0
If Timer - t > 0.5 Then Exit Do '2个0.5相加就是1s
DoEvents
Loop
If GetAsyncKeyState(27) < 0 Then Debug.Print "长安功能"
End If
Else
flag = False
End If
End Sub

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-09
Private a As Long
Private b As Boolean

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then
If Not b Then
a = Timer
End If
b = True
End If
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then
If Timer - a > 1 Then MsgBox "long"
b = False
End If
End Sub

Private Sub Form_Load()
b = False
End Sub追问

1、测试你的代码了,大体实现了。但遗憾的是:MsgBox "long"是在KeyUp事件中。就是鼠标按ESC下去后重新起来的时候再执行的。能不能长按下去不起来,就执行MsgBox "long"?
2、你的代码中有个Timer,为什么不加时间控件就可执行?请解释下。谢谢

追答

你把判断放到keydown里就可以了
Private a As Long
Private b As Boolean
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then
If Not b Then
a = Timer
b = True
End If

If b And Timer - a > 1 Then
MsgBox "long"
b = False
End If
End If
End Sub

timer是得到开机时间 和时间控件无关

追问

1、有改进。但我发现用你这个新的代码,我短按三下键,它照样弹出msgbox。我之所以用长按,是因为“短按”是有其他用途的。如果短按三下相当于长按,就影响到了短按的其他用途,不好控制程序了。请再修改下,好吗
2、timer是得到开机(开电脑)时间?不是程序启动的时间吗?

vb怎样表示“长按”某个键,如ESC退出键?
Do If keyup Then Exit Do '未到时间放掉Esc键 If Timer - t >= settime Then flag = True Exit Do End If DoEvents Loop If flag Then Print "时间已到:" & settime '可以用msgbox,但由于长安esc后msgbox显示后马上又消失,这里只是一个功能,给你用print做显示 flag = False End If...

问一下在VB中设置用enter与esc键设置确认 退出、
同理,Cancel表示“取消”,通常人们都习惯用Esc键来表示取消某种操作,因此VB就通过Cancel属性把某个按钮与Esc键建立联系,按Esc键就相当于点击了这个按钮。当然,具体要“取消”什么(关闭窗体、取消修改等)是要你通过编程才能实现的,甚至乎可以与“取消”完全不沾边!一个按钮同时把Default和Cancel属性...

vb中如何写取消按钮的代码
还可以把这个按钮的Cancel属性设为True,这样如果按ESC键就相当于按了这个按钮,就有按ESC键退出的效果。

vb 实现自动按键盘如何写??
1.sendkeys "{键的名字 }" '(比如回车 "{enter}")2.'按组合键 启动任务管理器 Set WshShell = CreateObject("WScript.Shell")WshShell.SendKeys "^+{ESC} 3. api '最好是api 模拟键盘, 游戏游戏你上面的模拟是无效的,只有api 有效 Private Declare Sub keybd_event Lib "user32" (...

VB程序如何实现程序按"Esc"键退出?
Private Sub Form_Load()Me.KeyPreview = True End Sub Private Sub Form_KeyPress(KeyAscii As Integer)If KeyAscii = 27 Then End End Sub

VB中怎么表示按回车就执行command1,按esc就执行command2?求大神指教
把 Command1 的 Default 属性设为 True ,把 Command2 的 Cancel 属性设为 True ,即可。

VB如何在窗体中显示按下键盘按键的字母
VB在窗体中显示按下键盘按键的字母可以通过Form_KeyDown获取按键的KeyCode,然后再把KeyCode转换为相应的键的名字。代码如下:Private Sub Form_Load() Me.KeyPreview = True '使窗体可以获取键盘事件End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Print KeyCodeToStr(Key...

vb中,单击按钮,结束程序执行的代码是什么
Private Sub UserForm_Terminate()Unload frmSub '退出当前窗体前先关闭子窗体 End Sub

用VB编程实现自动每隔一秒自动点击ESC
If Command1.Caption = "开始" Then Timer1.Interval = 1000 Command1.Caption = "停止"Else Timer1.Interval = 0 Command1.Caption = "开始"End If End Sub Private Sub Form_Load()Command1.Caption = "开始"End Sub Private Sub Timer1_Timer()SendKeys "{ESC}" '模拟按键 End Sub ...

VB如何给一个按钮绑定热键? 比如command1 绑定为 ESC 就是按下ESC就等...
是通过属性cancel来实现的。设置为TRUE即可,又如按ENTER即是单机一次,是通过缺省属性defalut 来实现的。

相似回答