VB编程中的Keydown事件不让其反复触发的办法?

VB编程中编写如下一段程序:PrivateSubForm_KeyDown(KeyCodeAsInteger,ShiftAsInteger)SelectCaseKeyCod... VB编程中编写如下一段程序:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode

Case 37 'left
MSComm1.Output = "Le"
txtlinkmessage.Text = "向左"

Case 38 'up
MSComm1.Output = "Go"
txtlinkmessage.Text = "向前"

Case 39 'right
MSComm1.Output = "Ri"
txtlinkmessage.Text = "向右"

Case 40 'down
MSComm1.Output = "Ba"
txtlinkmessage.Text = "向后"

Case Else
KeyAscii = 0
End Select

End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 37 'left
MSComm1.Output = "Tu"
Case 39 'right
MSComm1.Output = "Tu"
Case 38 'up
MSComm1.Output = "Di"
Case 40 'down
MSComm1.Output = "Di"

End Select

End Sub

意图就是让按住某个方向键,就会串口发送一个数据命令,方向键抬起时,串口发送一个恢复命令
但是问题来了,我按住方向键时,串口会不断发送数据,如我按下左方向键时,会持续不断发送“Le”,但我只想让其发送一次就好了,怎么简单的做到呢?
第一个回答中的“设置一个变量,在KEYDOWN事件中=TRUE,在KEYUP中=FALSE;在KEYDOWN中判断如为真就不要再发送”我已经想到并考虑过,如果是单独为每个控制命令设一个变量的话可以实现需要的功能,但控制码比较多的时候,还是会很烦琐,第二个回答中加入“Dim bSend”,只用添加一个变量,但是如果比如我先一直按着“上”键,再按“左”键,此时左键按下的事件会不响应,必须等到先把第二个按下的按键先抬起再第二次按下时才会相应~第三种回答加入“Dim Num”,方法与第二个回答类似,但还是会在执行的时候出现如第二种方法的问题,请问有更好的改进的方法吗?
展开
 我来答
lxz1969
2009-03-20 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8524
采纳率:33%
帮助的人:1.1亿
展开全部
可以加一个标记Num,如果Num=0,说明是第一次按下,按下后置NUm=Num+1,如果Num=0,则发送,否则不发送。修改如下:
dim Num as integer'定义一个全局变量
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
if num =0 then
Select Case KeyCode
Case 37 'left
MSComm1.Output = "Le"
txtlinkmessage.Text = "向左"
Case 38 'up
MSComm1.Output = "Go"
txtlinkmessage.Text = "向前"
Case 39 'right
MSComm1.Output = "Ri"
txtlinkmessage.Text = "向右"
Case 40 'down
MSComm1.Output = "Ba"
txtlinkmessage.Text = "向后"
Case Else
KeyAscii = 0
End Select
end if
num=num+1
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 37 'left
MSComm1.Output = "Tu"
Case 39 'right
MSComm1.Output = "Tu"
Case 38 'up
MSComm1.Output = "Di"
Case 40 'down
MSComm1.Output = "Di"
End Select
num=0
End Sub
百度网友e9042513a
2009-03-20 · TA获得超过6984个赞
知道大有可为答主
回答量:2388
采纳率:0%
帮助的人:3506万
展开全部
定义一个窗体变量
Dim KeyValue As Integer

Private Sub Form_Load()
KeyValue = -1

End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyValue = KeyCode Then Exit Sub'添加

Select Case KeyCode

Case 37 'left
MSComm1.Output = "Le"
txtlinkmessage.Text = "向左"

Case 38 'up
MSComm1.Output = "Go"
txtlinkmessage.Text = "向前"

Case 39 'right
MSComm1.Output = "Ri"
txtlinkmessage.Text = "向右"

Case 40 'down
MSComm1.Output = "Ba"
txtlinkmessage.Text = "向后"

Case Else
KeyAscii = 0
End Select

KeyValue = KeyCode'添加
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 37 'left
MSComm1.Output = "Tu"
Case 39 'right
MSComm1.Output = "Tu"
Case 38 'up
MSComm1.Output = "Di"
Case 40 'down
MSComm1.Output = "Di"

End Select

If KeyValue = KeyCode Then KeyValue = -1'添加

End Sub
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
afylyl
2013-02-05
知道答主
回答量:2
采纳率:0%
帮助的人:3028
展开全部
建一个按键asc码的映射表,对每个键设置一个bool类型的标志表示是否按下,每次按键事件先查表,确定其按下与否,在决定是否响应keydown事件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
temp2000
2009-03-20 · TA获得超过483个赞
知道小有建树答主
回答量:564
采纳率:100%
帮助的人:350万
展开全部
设置一个变量,在KEYDOWN事件中=TRUE,在KEYUP中=FALSE;在KEYDOWN中判断如为真就不要再发送了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式