2016-07-18 2 views
1

Bonjour J'ai de la difficulté à afficher un formulaire lorsqu'un ensemble de touches spécifique est enfoncé. Le formulaire principal s'exécute en premier; c'est une seconde forme qui est censée être cachée jusqu'à ce que vous basculiez en appuyant sur ctrl + alt + shift + h. C'est le code que j'ai, je crois que cela devrait fonctionner, mais ce n'est pas le cas. Je l'ai essayé comme ça, dans une minuterie qui vérifie les événements de presse tous les 1 millisecondeVB bascule sous forme spécifique avec des événements de presse de touche

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 

Et j'ai essayé aussi une fonction séparée comme ceci:

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 

Nous vous remercions à l'avance pour l'aide.

+0

Vous ne devriez absolument pas utiliser 'Timer'. Pas en aucune circonstance. La première question est de savoir si vous voulez que cette combinaison de touches ne fonctionne que pendant que votre formulaire principal a le focus ou indépendamment de ce que la fenêtre a le focus. Si c'est ce dernier, vous devez utiliser l'API Windows pour enregistrer un raccourci clavier. Pour le premier, votre deuxième extrait de code est correct mais le formulaire ne déclenchera pas cet événement 'KeyDown' par défaut s'il contient des contrôles sélectionnables. Pour obtenir une telle forme pour élever des événements keybaod, vous devez définir sa propriété 'KeyPreview' à' True'. – jmcilhinney

+0

Il doit être basculé lorsque les touches sont enfoncées, quel que soit le focus du formulaire. – gregknight

+0

Dans ce cas, la gestion des événements du formulaire est inutile car ces événements ne peuvent pas être déclenchés si le formulaire n'a pas de focus. Vous devriez regarder dans l'API 'RegisterHotKey'. Vous serez en mesure de trouver beaucoup d'exemples avec une recherche. Assurez-vous simplement que vous utilisez des exemples spécifiques VB.NET ou que vous apportez les modifications appropriées aux exemples VB6. – jmcilhinney

Répondre

0

C'est ce que je cherchais. Merci à @jmcilhinney pour l'indication de RegisterHotKey sur la façon d'enregistrer des raccourcis clavier actifs. Ce code définit les raccourcis clavier sur alt + UPKEY. Je veux comprendre comment modifier les paramètres pour assigner plus de 2 clés, comme CTRL + ALT + MAJ + UPKEY. Mais je dois me rendre au travail, donc je vais y travailler ce soir et le mettre à jour demain pour tout le monde, à moins qu'un castor impatient ne veuille me montrer comment faire ça pendant que je suis au travail lol. Merci encore à tous ceux qui ont aidé!

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

Votre code a l'air correct (pas besoin de minuterie). Je pense que ce qui vous manque est le réglage de la KeyPreview à True

Lorsque cette propriété est définie sur true, le formulaire recevra tous KeyPress, KeyDown et événements KeyUp

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

Alors cela devrait fonctionner:

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

Cette citation est radicalement inexacte, pas de KeyPress ou KeyUp et pas toutes les clés. Où l'avez-vous copié? –

+0

@HansPassant - c'est sur la page MSDN que j'ai lié à https://msdn.microsoft.com/fr-fr/library/system.windows.forms.form.keypreview(v=vs.110).aspx –

+0

Cela fonctionne sans cela – BanForFun