2010-01-14 6 views
2

Je crée une disposition de clavier personnalisée. Comme étape de départ, je souhaite que l'utilisateur appuie sur une touche, que mon crochet du clavier l'intercepte et qu'il émette une autre clé de mon choix.Utilisation d'un crochet de bas niveau pour modifier les caractères du clavier

Je trouve ce code crochet du clavier, que je suis en train de modifier légèrement pour mes besoins: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx

J'ai changé la méthode appropriée à ceci:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
    { 
     KBDLLHOOKSTRUCT replacementKey = new KBDLLHOOKSTRUCT(); 
     Marshal.PtrToStructure(lParam, replacementKey); 
     replacementKey.vkCode = 90; // char 'Z' 
     Marshal.StructureToPtr(replacementKey, lParam, true); 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

Je veux qu'il déclare un nouvel objet de structure KBD, copie la structure KBD fournie par le hook du clavier, modifie le vkCode de mon objet pour utiliser un caractère différent, puis écrase l'objet fourni avec ma version modifiée. Cela devrait, espérons-le, garder tout le même, sauf pour le fait qu'il écrit un caractère différent.

Malheureusement, cela ne fonctionne pas. Le caractère original du clavier est tapé. Le volet de sortie Visual Studio obtient également une erreur A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe.

Qu'est-ce que je peux faire ici pour intercepter le crochet du clavier et de le remplacer par un caractère de mon choix?

Merci!

Répondre

4

Le deuxième paramètre pour Marshal.PtrToStructure doit être une classe et non une structure et KBDLLHOOKSTRUCT est probablement une structure.

Au lieu de cela, vous devez l'utiliser comme ceci:

KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); 
replacementKey.vkCode = 90; // char 'Z' 
Marshal.StructureToPtr(replacementKey, lParam, false); 
+0

Visual Studio me dit que c'est 'Marshal.PtrToStructure (IntPtr ptr, structure de l'objet);' ... est-ce que jive avec ce que vous dites? Il ne jette pas une erreur ou quoi que ce soit, compile bien. – cksubs

+0

Il compile bien mais lance une exception ArgumentException à l'exécution. –

+0

Pourquoi serait-il appelé PtrToStructure s'il ne sauvegardait pas le Ptr dans une structure? Mais si je dois le changer, que dois-je faire ici? Si je ne peux pas utiliser une structure KBD pour enregistrer le pointeur sur une structure KBD, comment puis-je le modifier? – cksubs

Questions connexes