VB.net密钥组合不起作用

时间:2016-06-29 14:19:40

标签: vb.net keyboard-shortcuts

以下代码适用于 Ctrl + D F2 F7 ,但不起作用 Ctrl + A 。谁知道问题可能是什么?

Private Sub AgentSetupForm_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    Select Case e.KeyCode
        '  Ctrl + A
        Case Keys.A And (e.Control And Not e.Shift And Not e.Alt)
            Dim f As New InvestorAccountsForm
            f.MdiParent = TraderoomMDI
            f.Show()

            '  Ctrl + D 
        Case Keys.D And (e.Control And Not e.Shift And Not e.Alt)
            Dim f As New InvestorAddressForm
            f.MdiParent = TraderoomMDI
            f.Show()
            '  F2, F7 
        Case Keys.F2 'And (e.Shift And Not e.Control And Not e.Alt)
            Me.Text = "F2 Test"
        Case Keys.F7
            stlFormMode.Text = "Edit"
    End Select

End Sub

2 个答案:

答案 0 :(得分:1)

接受的答案完全错误。 VB.NET不是C#。因此,如果在c = 1 "this causes no error or notification to the developer" b = 2 s(双方)的上下文中使用And,VB.NET会自动切换到逻辑Boolean而不是按位And。所以这根本不是问题。我只是运行OP代码并且运行正常 - Ctrl + A组合被成功捕获。此外,如果组合键意味着OS(或其他组件)的某些内容,那么它并不意味着它不会被我们的应用程序捕获。

AndAnd之间的区别在于第一个从左到右一直评估布尔表达式,即使某些表达式的计算结果为AndAlso。后者评估表达式UNTIL到达False或结束 - 即短路

为了提高代码的可读性,您可以在False语句中测试特定键。然后在特定情况下插入Case块以检查控制键的条件:

If

或者,您可以将Select Case e.KeyCode Case Keys.A If e.Control AndAlso Not (e.Shift OrElse e.Alt) Dim f As New InvestorAccountsForm f.MdiParent = TraderoomMDI f.Show() End If ' ' End Select 块分解为包含有关条件If的所有案例的Select Case

很遗憾,我无法回答您的问题,因为您的问题似乎无法(轻松)转载。根据评论,与代码中的e.Control AndAlso ...语句相比,它更可能是硬件或驱动程序相关的问题。

答案 1 :(得分:0)

修改

由于您似乎遇到了 CTRL + A 组合的问题,您可以尝试覆盖ProcessCmdKey并查看是否有效。应该在.NET环境处理和/或转换密钥之前调用该方法。

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
    If keyData = (Keys.Control Or Keys.A) Then
        ...your code here...
        Return True
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

如果其他组合有效,您可以将其保留在KeyDown事件中。

编辑2:

@BozhidarStoinev说的是正确的;我错了,说你现在正在使用按位和。

由于在VB.NET中如何转换布尔值,显然它在And - 语句中使用AndAlsoSelect Case。在这种情况下,只要第一个运算符只是And,您就可以了。我们使用了下面的AndAlso因为它们执行短路,因为AndAlso只评估左侧是True,所以Keys.A And (e.Control AndAlso Not e.Shift AndAlso Not e.Alt) 仅评估右侧。

以下内容:

(65 And True) = (65 And -1) = 65 'I added parentheses for improved readability

转换为:

(65 And False) = (65 And 0) = 0

或:

<anything> And False

不能确定多语句案例每次都会有效。它可能适用于键,但如果您在另一个Case中检查0,则<div class="search"> <div class="row"> <div class="large-6 medium-6 small-12 columns"> <div class="postcode-wrapper"> <form class="lookup-form"> <input type="text" class="postcode" placeholder="Location" > <input type="submit" class="go-btn" value="Search"/> <a href="#" class="fancybox go" style="position:absolute; left:-99999px" data-fancybox-type="iframe">Search</a> <div class="form-error"></div> </form> <script> jQuery('form').submit(function (evt) { evt.preventDefault(); var error = false; var error_list = []; var $postcode = jQuery('.postcode').val(); if($postcode == ''){ error = true; error_list.push('Location is required'); } console.log(error); if(error === true){ jQuery('.form-error').show(); jQuery('.search-results').hide(); jQuery('.form-error').html(''); for(i=0;i<error_list.length;i++){ jQuery('.form-error').append(error_list[i]+'<br/>'); } }else if(error === false) { jQuery('.form-error').hide(); jQuery('.postcode-wrapper .go').click(function(){ jQuery(".search-results").slideDown("slow"); }); var location = encodeURIComponent(jQuery('.postcode-wrapper .postcode').val()); console.log(location); jQuery('.postcode-wrapper .go').click(); } return false; }); </script> </div> </div> </div> </div> <div class="search-results"> <div class="map"> <iframe src="http://google.com/maps&location=OUTPUTHERE" width="100%" height="400" frameborder="0"></iframe> </div> </div> 等于零时可能会出现意外结果。