2016-07-18 9 views
1

こんにちは私は、特定のキーのセットが押されたときにフォームを表示するのが難しいです。メインフォームが最初に実行されます。これはctrl + alt + shift + hを押すことによってトグルされるまで隠されているはずの2番目のフォームです。これは私が持っているコードです、私はそれがうまくいくはずだと信じていますが、そうではありません。私はプレスイベントごとに1ミリ秒VBキープレスイベントで特定のフォームを切り替える

Private Sub tmrKeys_Tick(sender As Object, e As EventArgs) Handles tmrKeys.Tick 
    Dim key As String = Nothing 

    If My.Computer.Keyboard.AltKeyDown AndAlso My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown AndAlso key = "H" Then 
     Dim x = New form2() 
     x.Show() 
    End If 
End Sub 

をチェックするタイマーで、このようにそれを試してみましたが、私はまた、このような独立した機能を試してみました:

Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
    If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then 
     form2.Show() 
    End If 
End Sub 

が助けを事前にありがとうを。

+0

「タイマー」は絶対に使用しないでください。いかなる状況下でもありません。最初の質問は、メインフォームにフォーカスがあるときだけ、またはウィンドウにフォーカスがあるかどうかにかかわらず、このキーの組み合わせが機能するかどうかです。後者の場合は、Windows APIを使用してホットキーを登録する必要があります。前者の場合、2番目のコードスニペットは正しいですが、選択可能なコントロールがあれば、フォームはデフォルトでそのKeyDownイベントを発生させません。このようなフォームを取得してkeybaodイベントを発生させるには、 'KeyPreview'プロパティを' True'に設定する必要があります。 – jmcilhinney

+0

フォームのフォーカスに関係なくキーを押すと、トグルする必要があります。 – gregknight

+0

この場合、フォームにフォーカスがない場合はイベントを発生させることができないため、フォームのイベントを処理することは無意味です。 'RegisterHotKey' APIを調べてください。あなたは検索でたくさんの例を見つけることができます。 VB.NETの具体例を使用するか、VB6の例を適切に変更するだけです。 – jmcilhinney

答えて

0

これは私が探していたものです。アクティブなホットキーを登録する方法についてRegisterHotKeyへのヒントについては、@jmcilhinneyに感謝します。このコードは、ホットキーをalt + UPKEYに設定します。私は、CTRL + ALT + SHIFT + UPKEYのように2つ以上のキーを割り当てるためにパラメータを変更する方法を理解したいと思います。しかし、私は仕事に向かなければならないので、今夜は仕事に取り掛かり、誰もが明日更新する予定です。助けてくれた皆さん、ありがとう!

Public Class Form1 

Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer 
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer 
Public Const WM_HOTKEY As Integer = &H312 


Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    If m.Msg = WM_HOTKEY Then 
     Form2.Show() 
    End If 

    MyBase.WndProc(m) 

End Sub 


Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    Call UnregisterHotKey(Me.Handle, 9) 

End Sub 


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Call RegisterHotKey(Me.Handle.ToInt32, 0, &H1, 38) '<-- registers specific hotkeys 

End Sub 
End Class 
-1

コードはOKです(タイマーは不要です)。私は何が欠けていることTrueこのプロパティがtrueに設定されている

KeyPreviewの設定であると考え、形はすべて KeyPressイベント、KeyDownイベント、およびからkeyupイベントを受け取ることになります

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Form1.KeyPreview = True 
End Sub 

次に、これは動作するはずです:

Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
    If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then 
     form2.Show() 
    End If 
End Sub 
+0

その見積もりは劇的に不正確です。KeyPressやKeyUpはなく、すべての鍵ではありません。どこからコピーしましたか? –

+0

@HansPassant - MSDNページにあります。https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110).aspx –

+0

にリンクしています。これがなければ – BanForFun

関連する問題