有关VB.NET keypress 事件的问题

我做了一个Keypress的事件,但如果在keypress 事件执行中再单击按键,便会在执行完这次的keypress事件后接着执行下一次keypress 事件,有没有办法令到在执行keypress事件的期间按键无效,直到执行完后再按键才会再次执行keypress事件。

第1个回答  2013-04-06
定义两个变量
Private run As Boolean = False'过程是否在运行
Private Key_L As Boolean = False'L键是否按下

变通方法:加定时器,要执行的过程放在定时器中调用
keypress事件只检测某个键是否按下
在家里没有VS,引用我以前的例子给你,定义的是全局键盘,也就是在程序不激活的状态也能执行
下面是完整代码: ----按下L键过程xx只会执行一次,直到过程执行完成才再次响应
Public Class Form1
Private run As Boolean = False
Private Key_L As Boolean = False
Public Declare Auto Function RegisterHotKey Lib "user32.dll" Alias _
"RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean

Public Declare Auto Function UnRegisterHotKey Lib "user32.dll" Alias _
"UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'注册全局热键
RegisterHotKey(Handle, 0, 7, Keys.C)
RegisterHotKey(Handle, 1, Nothing, Keys.L)
' 0=nothing 1 -alt 2-ctrl 3-ctrl+alt 4-shift 5-alt+shift 6-ctrl+shift 7-ctrl+shift+alt
End Sub

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
UnRegisterHotKey(Handle, 0)
UnRegisterHotKey(Handle, 1)
End Sub
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = 786 Then

If m.WParam.ToInt32 = 1 Then
Key_L = True
'MsgBox(m.Msg & "我1")
ElseIf m.WParam.ToInt32 = 0 Then
MsgBox(m.Msg & "我2")
End If

'TextBox1.Text &= " " & m.Msg
End If
MyBase.WndProc(m)
End Sub
Sub xx()
run = True
Button1.Enabled = False
For i = 0 To 100
TextBox1.Text = i.ToString
Threading.Thread.Sleep(1)
Application.DoEvents()
Next
Button1.Enabled = True
Key_L = False
run = False
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If run = True Then Exit Sub
If Key_L = True Then xx()
End Sub
End Class
第2个回答  2013-04-06
你可以定义一个布尔型全局变量。 比如 dim boo as boolean 然后在form load 事件里 boo=true 在key press事件里 if boo=true then boo=false 你要执行的代码 。。。。。。。 。。。。。。。 。。。。。。。 你的代码执行完毕 boo=true end if追问

照你这做法,比如我连双击,还是会执行两次Keypress事件,因为两按一次键,keypress事件就会排在之前的一次keypress事件后面。而我希望是在处理keypress事件期间,所有的按键信息都会无效。请问还有其它办法吗,谢谢。

第3个回答  2013-04-06
在你的keypress事件中肯定会有一个键盘的判断语句,试试将你的判断语句中的比较对象设置成变量。每次只有将keypress事件执行完才能将变量恢复成可接受值!
举例如下:
下面的变量可以放在事件外面初始化
Dim myKey As Keys
myKey = Keys.Enter

keypress事件中如下:

If e.KeyChar = Microsoft.VisualBasic.Chr(myKey) Then

myKey = Keys.None

。。。

myKey = Keys.Enter

end if
第4个回答  2013-04-06
你的意思应该是执行时不要响应任何操作,那开始执行时令按钮的enabled=false,执行完再true就可以了。追问

能告诉我怎样令按钮的enabled=false 吗?谢谢。

追答

你的按钮应该有名称吧?就是

按钮名称.enabled = false

VB.net按钮名称默认是 button1、button2这样的,以前的VB6是什么不记得了。
执行完后,再
按钮名称.enabled = true

追问

照你这方法,按钮(BUTTON)是可以,但我问的按键KEYPRESS) 不行,打keypress.eneable 会有error。请问是什么原因?

追答

哦,不好意思,我搞错了。
这样的话应该是在执行的期间屏蔽按键信息,如果用API函数应该很容易处理,但我也不熟,你可以百度一下“ API函数 屏蔽按键信息”,不过这样可能会产生其他副作用。
可以设想一个简单的方法,如果你的key事件是在textbox之类的控件里引发的,则引发后启用窗体的keypreview属性,这样窗体会优先拦截按键信息,应该就不会给控件接收到。或者引发事件后移开控件的焦点。如果你的事件就是窗体的事件,那试试把整个窗体的enable给false了。
对了,如果是控件的事件,应该也可以把控件的enabled给false掉,这样应该也接收不到按键事件的。

追问

谢谢了,不过我发现就算是按钮(button), 我enabled = false 以后我用鼠标对着按钮按3下,仍然会执行3次button事件,这又是什么原因呢?

追答

按钮false后,会变成灰色的,鼠标按了根本没有反应的,就是不会有塌下去那个样子,怎么会有事件?如果按钮变灰色,但还有click事件响应,那可以去找微软公司报告了。应该是按钮名称弄错了吧?

追问

enable =false后是没错变灰色了,不过在变灰色的时候按按钮,比如按3下,等enable= true 后仍会执行3次button的。因为我看见在enable
= true后按钮会自动按下,所以我怀疑按按钮的次数被记下了,enable
=false 后只延迟了按按钮的时间。

追答

不会的。你要把enable =false这句话放在整个执行的最前面,就是要禁止按钮后才能做其他事,否则,你点了按钮后,还来不及false,已经去执行其他事情,那么这时还是会记录你的click。
整个过程应该这样.

sub button1_Click(...) handle...
button1.enable = false
这里开始复杂的过程
button1.enable =true
end sun
对了,试试在button1.enable = false后加上一句
application.doevents

追问

我的代码是下面这样的,的确在灰的时候按按钮也会记数的。是我打错了吗,还是system sleep 的问题
Button1.Enabled = False
Dim g As Graphics = Me.CreateGraphics()
g.DrawImage(NewBitmap("C:\A.bmp"),0, 0)
System.Threading.Thread.Sleep(5000)
g.DrawImage(NewBitmap("C:\B.bmp"),0, 0)
System.Threading.Thread.Sleep(5000)
Button1.Enabled = True

追答

我试了一下,如果在中间用个msgbox弹出来一下,则无论怎么点都只会弹出来一次,即没有记数。
如果用textbox显示,则会记数。不过插入application.doevents这句话可以避免,只是这句话的插入需要考虑插入位置。如果是大循环,则必须插入在循环中,按你这个程序,必须每个sleep一个,即
Application.DoEvents()
System.Threading.Thread.Sleep(5000)
Application.DoEvents()
System.Threading.Thread.Sleep(5000)
Application.DoEvents()

因为doevents的作用就是去相应你的鼠标的,当最后一句doevents执行的时候,enable还是false的,这时可以把所有鼠标计数释放掉,由于按钮还是false状态,所以不会发生事件。只要最后一句doevents执行后才enable为true,就不会出现计数问题。另外注意doevents会增加运行时间。

这个方法比较笨,但简单,您也可以考虑用API

本回答被提问者采纳

有关VB.NET keypress 事件的问题
Private run As Boolean = False'过程是否在运行 Private Key_L As Boolean = False'L键是否按下 变通方法:加定时器,要执行的过程放在定时器中调用 keypress事件只检测某个键是否按下 在家里没有VS,引用我以前的例子给你,定义的是全局键盘,也就是在程序不激活的状态也能执行 下面是完整代码:...

vb.net keypress 回车不响应
应该使用KeyDown事件。使用e对象来定位键符!代码参考:Private Sub ListBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyDown If e.KeyCode = Keys.Enter Then End If End Sub ...

VB.NET中keypress、keydown、keyup事件有什么区别?e.keychar和e.keycode...
keypress:操作窗格具有焦点并按下某个键时发生,不能由非字符键引发 keydown:按下键盘按键时发生 keyup:键盘按键弹起时发生 以上事件触发的时间不同,顺序 down press up keychar:按键对应的字符 keycode:获取 KeyDown 或 KeyUp 事件的键盘代码 char不能获取 控制键如tab Insert delete 方向键等 ...

VB.NET全局键盘和鼠标钩[Vb.Net钩]
`KeyboardHookProc`函数处理键盘事件,根据事件类型(如键按下、键释放或系统键)调用相应的事件处理逻辑,如`KeyDown`, `KeyPress`, `KeyUp`。通过事件处理程序执行特定操作或逻辑响应。总结 以上代码展示了在VB.NET中实现全局键盘和鼠标挂钩的完整流程,包括常量定义、事件委托处理、挂钩创建与销毁、以及...

vb.net,datagridview单元格内打字时,单元格下拉显示SQL数据库搜索结果...
代码太长太复杂了,解释起来还麻烦,只能给个思路,自己研究吧!1。在datagridview中的keyPress事件中设置处理过程 2。处理过程为每次读取当前单元格(CurrentCell)的内容,查询SQL数据库 3。将查询结果放入一个代码创建的ComboBox的列表中

vb.net的textbox中可以正常输入英文数字切换到中文输入法一按键就退出...
PrivateSubText1_KeyPress(KeyAsciiAsInteger)If((KeyAscii>=48AndKeyAscii=65AndKeyAscii=97AndKeyAscii<=122))=FalseThenKeyAscii=0EndSub

vb.net计算器如何从键盘输入
在Form_KeyPress事件中检测按键,对应数字和功能键

vb.net 方向键不能触发 keydown 事件
Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean If keyData = Keys.Left Or keyData = Keys.Right Or keyData = Keys.Up Or keyData = Keys.Down Then Return False'如果是方向键返回FALSE,意思是继续执行form的keydown事件.Else Return MyBase.ProcessDialogKey(...

vb.net中textbox输入完后如何直接按回车
思路很简单:通过textbox的keypress事件来捕获键盘输入,输入输入的是回车键,则调用Button_click事件 代码如下:Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.KeyCode = 13 Then call Button1_Click()end if...

VB.NET:键盘控制焦点移动
编写一个方法 代码如下: FocusMove Is Function Name ControlName Is the Control s Name Which you want to use Private Sub FocusMove()Sub FocusMove(ByVal sender As Object ByVal e As System Windows Forms KeyPressEventArgs) Handles ControlName KeyPress ControlName KeyPress If e KeyChar...

相似回答