2010-08-17 5 views
0

Je travaille sur le projet VB6 où j'ai besoin de raccourcis clavier pour les boutons du contrôle de barre d'outils. Pour ce faire, j'ai utilisé la bibliothèque Win32 Hooks de vbAccelerator. Voici ma fonction IWindowsHook_HookProc, que j'utilise pour récupérer les touches & effectuer une action basée sur raccourci pressé (Ctrl + N pour New, Ctrl + O pour Open et Ctrl + S pour Save), mais je ne sais pas quel est le problème avec le code qui bloque mon application avec VB6 IDE. La fonction est actuellement incomplète car j'ai juste essayé d'identifier la combinaison de touches "Ctrl + N" pour tester cette fonctionnalité. S'il vous plaît aidez-moi ...: - |Utilisation de vbAccelarator Win32 Hook bloque l'application avec VB IDE

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long 
If KeyboardlParam(lParam).KeyDown Then 
    Select Case True 
      Case Me.ActiveControl = Me 
       If wParam = vbKeyControl + vbKeyN Then 
         frmNewReport.show 
         bConsume = True 
       End If 
    End Select 
End If 

Répondre

0

J'ai trouvé une solution à ma propre question, elle est toujours sujette aux crashs si elle n'est pas manipulée avec précaution, mais maintenant mon application répond vraiment à combinaisons de touches que je voulais, Ctrl + N, Ctrl + O, etc Voici mon code rectifié qui fonctionne bien pour autant que je sache. Ne suggérez pas si vous trouvez un bogue qui a causé le crash de mon application.

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 

Private Property Get CtrlPressed() As Boolean 
    CtrlPressed = (GetAsyncKeyState(vbKeyControl) <> 0) 
End Property 

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long 

If wParam = vbKeyN Then 
    If CtrlPressed Then 
     LoadFormNewReport 'Method that opens Child Form 'New Report' 
    End If 
    bConsume = True 

ElseIf wParam = vbKeyS Then 
    If CtrlPressed Then 
     SaveNewReport 'Method that saves new Report 
    End If 
    bConsume = True 

ElseIf wParam = vbKeyF5 Then 
    If Not CtrlPressed Then 
     frmSettings.Show 'This form needs to be displayed Modally but if tried so then crashes application along with VB IDE, other short-cuts work fine. 
     bConsume = True 
    End If 

End If 

End Function 
1

Je n'ai aucune expérience avec cette bibliothèque de crochets, mais je pense que vous devriez faire très peu dans la procédure HookProc elle-même. Vous êtes appelé directement à partir de l'API Windows, plutôt que via l'environnement d'exécution VB6. Je ne suis pas surpris que l'affichage de formulaires écrase tout comme vous le décrivez. Existe-t-il des conseils sur le site vbAccelerator concernant le type de code à mettre en HookProc? vbAccelerator est un excellent site d'ailleurs.

Je vous suggère de définir une variable d'indicateur quelque part pour indiquer que frmNewReport doit être affiché. Vous devriez avoir un Timer en cours d'exécution avec un court intervalle de temps, disons 100 millisecondes, qui vérifie la variable d'indicateur: si l'indicateur est défini, effacez l'indicateur et affichez le formulaire.

+0

Merci pour la réponse, je dois télécharger la source complète de vbAccerator qui démontre l'utilisation de crochets de clavier, dans ce projet crochets sont mises en évidence à l'aide des commandes standard. Par exemple; Une boîte de texte est donnée sur le formulaire, comme un comportement normal, en appuyant sur un onglet après la mise au point le contrôle se concentrera sur le contrôle suivant, mais avec l'aide de Hook, lorsque Tab est pressé, le texte de la zone de texte est tabulé comme n'importe quel traitement de texte. J'ai utilisé une logique similaire, mais avec le contrôle de la barre d'outils, et comme mon formulaire MDI principal n'a pas besoin de barre de menu, j'ai besoin de raccourcis pour les boutons de la barre d'outils uniquement. – Kushal

2

l'aide d'un crochet dans l'IDE peut conduire à beaucoup d'accidents, diable en utilisant un crochet sans en comprendre pleinement ce que vous faites va conduire à beaucoup de la période des accidents ...

Mark est correct au sujet de la Minuterie avec le formulaire de spectacle, comme la fonction Hook devrait revenir aussi vite que possible (< 50 ms) ou votre volonté se retrouvent avec blocage (et une application écrasée) très rapidement. Ne définissez jamais un point d'arrêt dans la procédure Hook, sinon vous allez tuer votre IDE (peut-être crash, peut-être pendu, peut-être un état wierd où vous ne pouvez jamais quitter un point d'arrêt et vous ne pouvez pas arrêter le débogage). Si vous avez une tonne de fonctions longues que vous souhaitez exécuter en appuyant sur une touche, configurez une pile d'actions à exécuter dans la minuterie. L'utilisation d'une bibliothèque de hooks est très puissante, mais avec beaucoup de puissance, il y a de gros crashs ...

+0

Je vais utiliser la minuterie pour appeler la méthode HookProc périodiquement, mais actuellement mon code (méthode HookProc comme indiqué dans ma question) est incapable d'identifier les événements clés, et je ne comprends pas comment obtenir des raccourcis clavier pour le contrôle de la barre d'outils. seulement le contrôle que je veux dans mes boutons Main MDI From) d'une manière plus pragmatique en utilisant Hooks. – Kushal

Questions connexes