Button1.Text="&Open" 为什么只按O键就可触发Click事件

xcq1314 2014-07-01 08:09:20
加精
我在VB2008中窗体的添加一个按钮Button1,设置Text属性为&Open,运行后,只需要按下"O"一个键就会触发按钮的Click事件。而不是大家说的Alt+O,在VB2012中也是如此。是什么原因呢?请高手指点一下,还要设置什么吗?
...全文
988 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
huwei001982 2014-07-11
  • 打赏
  • 举报
回复
我估计是 alt 键粘连了, 你把ctrl, shift, alt 键每个多按几下就好了 我碰到类似的情况有5,6次了, 一直搞不懂到底是键盘的原因还是操作系统的bug或者是软件的bug
zphero88 2014-07-11
  • 打赏
  • 举报
回复
hello,我要积分,给我吧
hugh_z 2014-07-11
  • 打赏
  • 举报
回复
learning
cattpon 2014-07-11
  • 打赏
  • 举报
回复
不清楚,研究一下。。
GW786228836 2014-07-11
  • 打赏
  • 举报
回复
卖水果的net 2014-07-11
  • 打赏
  • 举报
回复
LZ 这个情况可以理解,如果你用的是win7 系统,你右键某一个文件夹,属性,你直接按下那些按钮上的字母,也可以打开相应的窗口。 所以,基本确定这是在操作系统层面做的改动,跟 VS 应该没有什么关系。
lailaide1234 2014-07-10
  • 打赏
  • 举报
回复
不明角力....
Tiger_Zhao 2014-07-04
  • 打赏
  • 举报
回复
这是 Reflector 反编译出的代码,仅供分析。

滚动条到头是 Value = Maximum - LargeChange。
比如当前页面的,拖到底正好内容末端对齐窗口底部;如果 Value = Maximum 就要内容末端对齐窗口顶部,就显示一片空白,这不科学
xcq1314 2014-07-04
  • 打赏
  • 举报
回复
tiger兄太牛了,不过你的代码是不是不全啊,我拷过来怎么运行不了?其实我只是想知道是否是我的电脑或设置的原因。这个应该是个Bug吧,容易造成误操作,只好在Buttonr_Click中判断一下alt键的状态进行处理了。 Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button.Click If GetAsyncKeyState(Keys.Menu) <> 0 OrElse e.GetType.Name = "MouseEventArgs" Then'如果按下Alt或鼠标单击 '你的代码 End If End Sub .net中还有一些让人莫名其妙的地方,SrollBar如果设置LargeChange大于1时,运行后Value永远也达不到Maximum。只能用代码来设置。你说烦不?算了,结贴吧!
Tiger_Zhao 2014-07-04
  • 打赏
  • 举报
回复
引用 10 楼 xcq1314 的回复:
这个说法似乎不对吧:滚动条到头应该是:value=Maximum+1 - LargeChange
我考虑不周,应该 +1。
引用 10 楼 xcq1314 的回复:
一张卡说最多能充100元(maximun=100),一次最多能充10元(LargChange=10),结果你拖动滚动条充啊充,显示到底了,结果里面只有91元。合理吗?
你最后充进去的是第 91~100 元这一段,LargChange=10 的时候怎么会只看到 91 呢?
xcq1314 2014-07-04
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
这是 Reflector 反编译出的代码,仅供分析。 滚动条到头是 Value = Maximum - LargeChange。 比如当前页面的,拖到底正好内容末端对齐窗口底部;如果 Value = Maximum 就要内容末端对齐窗口顶部,就显示一片空白,这不科学
这个说法似乎不对吧:滚动条到头应该是:value=Maximum+1 - LargeChange 另外如果拖到底内容末端对齐窗口底部:value=Maximum - LargeChange。Value = Maximum 就要内容末端对齐窗口顶部,那么LargeChange就是内容的高度了。这应该是两个概念吧! 我不清楚.net的后台究竟是怎么样的。但比应用层面来说,打个比方。一张卡说最多能充100元(maximun=100),一次最多能充10元(LargChange=10),结果你拖动滚动条充啊充,显示到底了,结果里面只有91元。合理吗?
Tiger_Zhao 2014-07-02
  • 打赏
  • 举报
回复
Alt+O 应该是默认的 WndProc 进行了设置焦点和点击。
焦点状态按 O 是 .Net 处理的:
'System.Windows.Forms.Button

Protected Friend Overrides Function ProcessMnemonic(ByVal charCode As Char) As Boolean
'下面三个判断分别为:用快捷键、可以处理快捷键、是快捷字符(与 Alt 无关)'
If ((MyBase.UseMnemonic AndAlso Me.CanProcessMnemonic) AndAlso Control.IsMnemonic(charCode, Me.Text)) Then
Me.PerformClick
Return True
End If
Return MyBase.ProcessMnemonic(charCode)
End Function

Public Sub PerformClick()
If MyBase.CanSelect Then
Dim flag As Boolean
'这里是当前有焦点,还是和 Alt 无关'
Dim flag2 As Boolean = MyBase.ValidateActiveControl(flag)
If (Not MyBase.ValidationCancelled AndAlso (flag2 OrElse flag)) Then
MyBase.ResetFlagsandPaint
Me.OnClick(EventArgs.Empty)
End If
End If
End Sub

xcq1314 2014-07-02
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
添加一个 TextBox 并让它得到焦点,再试试。
呵呵,当然如果TextBox得到焦点时,单独按键是在TextBox中输入,但在没有输入焦点的控件(如另一个按钮)获得焦点时,单独按下O键会触发按钮的Click事件。 大家可以试试,只用一个按钮测试一下,是否只用单键而不是组合键就可以触发Click事件。MSDN上我也没有找到答案都是说的是组合键。单键触发会给人莫名其妙的感觉。
of123 2014-07-02
  • 打赏
  • 举报
回复
添加一个 TextBox 并让它得到焦点,再试试。
xcq1314 2014-07-02
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
你是不是先按过了alt?
组合键应该是同时按下,怎么会有按过一说。
threenewbee 2014-07-01
  • 打赏
  • 举报
回复
你是不是先按过了alt?
xcq1314 2014-07-01
  • 打赏
  • 举报
回复
在vb6中只能用Alt+O触发,在VB2008中的菜单设置Text="&Open"也只能使用组合键Alt+O触发,为什么Button却只按O键就可以触发(当然按Alt+O组合键也能触发)。这是为什么呢???
bcrun 2014-07-01
  • 打赏
  • 举报
回复
其实我以前碰到这个时也觉得有点特别。我想这大概是WinForms框架中默认的响应加速键的方式吧,只是一时也不好在msdn library中查证一番。

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧