有個VB6的問題想解決卻沒頭緒,希望大家幫幫忙

时间:2021-11-06 16:04:47
在一个窗体中有一个Label控件,Caption属性为:&Quit,该标签的Click事件中我写入了这么一句关闭当前窗口的代码:Unload Me

但我想让用户按快捷键 Alt+Q 也执行同样的操作,於是我就将窗口的键预览属性设置为True,并在窗口的Key_Down事件中加入了以下代码:
if shift = 4 and keycode = vbkeyQ then unload me

问题来了,当我按下Alt+Q的时候,窗口接收不到这个组合快捷键,原因是应为该Label控件的属性是&Quit,每次按这个快捷键时总是被Label控件截获了先的。如果我把Label控件Caption中的&去掉的话,用户又不知道按这个快捷键可以关闭当前窗口。如果我将该Label控件的Enablad属性设置为假的话,窗口的Key_Code事件是被执行了,但Label控件的Click事件就无法执行了。

其实要折衷的办法是很多,但今天我想问大家的不是怎么解决这个问题,而是想与大家探讨一下在这种情况下有没有办法让窗口的Key_Code事件优先与Label控件截获这个快捷键,又或者是有什么方法可以让Label控件不接收这个快捷键?

希望大家给点意见,谢谢!

12 个解决方案

#1


换成个按纽应该可以的

#2


首先谢谢楼上的朋友,换成个按钮显然是可以解决问题的,但我上面说了,其实我想问的是如何能让窗口的Key_Code事件优先与Label控件截获这个快捷键,又或者是有什么方法可以让Label控件不接收这个快捷键,而不是研究怎么去解决实际问题。不过还是谢谢!

#3


搂主要不用钩子截获?

#4


能不能勞駕snto(神中神)朋友詳細些說明一下方法?我沒能領悟到您概念啊,謝謝!

#5


就是调api,实现一个键盘hook,截获Alt+Q的键盘消息,如还想控件响应Alt+Q,截获后再发送一个Alt+Q消息出去就行了,我以前做过类似的hook,截获回车键,问题是代码不在身边,网上有一些,你找找吧,ps:截获后如何实现再发送没试过,应该可行吧

#6


不好意思,我试了一下,貌似都没有接获到Alt+Q,楼住用 keydown可以接获到组合键么?我只接获到了alt键 keycode=18, shift=4

#7


好像组合键要用到keyup吧。

#8


谢谢各位的意见。
先回应一下snto(神中神)的意见吧,您提供的方式貌似是可以实现的,但就必须注册一个系统级的热键,这样的话就会碰上一些意料之外的问题的啦,例如与系统的其它热键冲突之类的。但在没有办法之下这也许就是目前我所能够做到的最好的办法来的了吧。说心里话,我还是希望可以用拦截的方式将系统发送给Label的消息拦截掉,然后将控制的主动权交还给窗口,那窗口的键盘事件KeyDown就可以发挥用处了。

然后再回一下mostro(祥子)的意见,首先您说的字母Q的Keycode是81,不是18,而大些的字母QKeyascii则是113。我用以下三种方式写的代码都没能生效:

代码写法1:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And (KeyCode = 81 Or KeyCode = 113) Then TextButton1_Click
End Sub

代码写法2:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And KeyCode = 81 Then TextButton1_Click
End Sub

代码写法3:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And KeyCode = 113 Then TextButton1_Click
End Sub

但只要将Label的Caption属性中的&去掉就三种方式的代码都能生效。看来问题还得继续探讨才行,谢谢各位。

#9


帮不了你了,vb.net下通得过的,控件根本不响应Alt+Q,不存在优先的问题

Public Class Form1

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
        Me.Close()
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.Alt And e.KeyCode = Keys.Q Then Label1_Click(sender, e)
    End Sub

End Class

#10


啊?是吗?我赶紧去装个VB.NET研究一下看,再次谢谢!

#11


奇怪了,我按下alt后就只接收到了 18,就是说,直接受到了alt键,并没有Q,呵呵。

#12


mostro(祥子)您书写代码的事件没有搞错吧?应该是Form_KeyDown事件哦。

#1


换成个按纽应该可以的

#2


首先谢谢楼上的朋友,换成个按钮显然是可以解决问题的,但我上面说了,其实我想问的是如何能让窗口的Key_Code事件优先与Label控件截获这个快捷键,又或者是有什么方法可以让Label控件不接收这个快捷键,而不是研究怎么去解决实际问题。不过还是谢谢!

#3


搂主要不用钩子截获?

#4


能不能勞駕snto(神中神)朋友詳細些說明一下方法?我沒能領悟到您概念啊,謝謝!

#5


就是调api,实现一个键盘hook,截获Alt+Q的键盘消息,如还想控件响应Alt+Q,截获后再发送一个Alt+Q消息出去就行了,我以前做过类似的hook,截获回车键,问题是代码不在身边,网上有一些,你找找吧,ps:截获后如何实现再发送没试过,应该可行吧

#6


不好意思,我试了一下,貌似都没有接获到Alt+Q,楼住用 keydown可以接获到组合键么?我只接获到了alt键 keycode=18, shift=4

#7


好像组合键要用到keyup吧。

#8


谢谢各位的意见。
先回应一下snto(神中神)的意见吧,您提供的方式貌似是可以实现的,但就必须注册一个系统级的热键,这样的话就会碰上一些意料之外的问题的啦,例如与系统的其它热键冲突之类的。但在没有办法之下这也许就是目前我所能够做到的最好的办法来的了吧。说心里话,我还是希望可以用拦截的方式将系统发送给Label的消息拦截掉,然后将控制的主动权交还给窗口,那窗口的键盘事件KeyDown就可以发挥用处了。

然后再回一下mostro(祥子)的意见,首先您说的字母Q的Keycode是81,不是18,而大些的字母QKeyascii则是113。我用以下三种方式写的代码都没能生效:

代码写法1:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And (KeyCode = 81 Or KeyCode = 113) Then TextButton1_Click
End Sub

代码写法2:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And KeyCode = 81 Then TextButton1_Click
End Sub

代码写法3:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 4 And KeyCode = 113 Then TextButton1_Click
End Sub

但只要将Label的Caption属性中的&去掉就三种方式的代码都能生效。看来问题还得继续探讨才行,谢谢各位。

#9


帮不了你了,vb.net下通得过的,控件根本不响应Alt+Q,不存在优先的问题

Public Class Form1

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
        Me.Close()
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.Alt And e.KeyCode = Keys.Q Then Label1_Click(sender, e)
    End Sub

End Class

#10


啊?是吗?我赶紧去装个VB.NET研究一下看,再次谢谢!

#11


奇怪了,我按下alt后就只接收到了 18,就是说,直接受到了alt键,并没有Q,呵呵。

#12


mostro(祥子)您书写代码的事件没有搞错吧?应该是Form_KeyDown事件哦。