2009-06-11 4 views
0

Je veux enregistrer mes frappes au clavier. Cependant, quand j'ajoute un nouveau clavier à keyList, il change tous les articles au nouveau. Par exemple, si keyList contient A et B, et que je tape C, alors ma liste de touches serait C, C, C au lieu de A, B, C.Problème avec KeyLogger en C#

savez-vous ce qui cause ce problème? Ne devrais-je pas utiliser List? KeyboardEvent est une classe, et donc transmise "par référence"

KeyboardEvent myKeyBoardEvent = new KeyboardEvent(); 
List<KeyboardEvent> keyList = new List<KeyboardEvent>(); 
List<WorkflowEvent> myLogs = new List<WorkflowEvent>(); 

public void LogKeyboadEvent(Key keyboard) 
{ 
myKeyBoardEvent.Key = keyboard.ToString(); 
keyList.Add(myKeyBoardEvent); 
myLogs.Add(myKeyBoardEvent); 
} 
+0

N'avez-vous pas à spécifier un type avec la liste? c'est-à-dire Liste James

+0

Les types sont KeyBoardEvent qui est un objet qui a un membre clé (chaîne). – paradisonoir

Répondre

3

Cela signifie que vous n'en avez jamais qu'une seule copie. Vous ajoutez le même objet à la liste 3 fois.

Cela aurait aussi le même effet:

myKeyBoardEvent.Key = "A"; 
myLogs.Add(myKeyBoardEvent); 
myLogs.Add(myKeyBoardEvent); 
myLogs.Add(myKeyBoardEvent); 
myKeyBoardEvent.Key = "C"; 

Liste contient maintenant: C, C, C

Pour résoudre ce problème, faire la myKeyBoardEvent locale à la fonction et il suffit de créer une nouvelle KeyboardEvent chaque fois.

Voici une version fixe:

List<KeyboardEvent> keyList = new List<KeyboardEvent>(); 
List<WorkflowEvent> myLogs = new List<WorkflowEvent>(); 

public void LogKeyboadEvent(Key keyboard) 
{ 
    KeyboardEvent myKeyBoardEvent = new KeyboardEvent(); 
    myKeyBoardEvent.Key = keyboard.ToString(); 
    keyList.Add(myKeyBoardEvent); 
    myLogs.Add(myKeyBoardEvent); 
} 
+0

merci qui a très bien fonctionné. – paradisonoir

0

Ce problème est fondamental. myKeyBoardEvent est une référence non une valeur et la liste contient une référence au même objet.

mise en œuvre correcte serait:

public void LogKeyboadEvent(Key keyboard) 
{ 
    keyBoardEvent = new KeyboardEvent(); 
    keyBoardEvent.Key = keyboard.ToString(); 
    keyList.Add(keyBoardEvent); 
    myLogs.Add(keyBoardEvent); 
} 

Ici, il fonctionnera, mais l'objet le changement dans la liste des Mylogs changera sur le keyList aussi. Autre approche prendra plus de mémoire, mais fixer des changements:

public void LogKeyboadEvent(Key keyboard) 
{ 
    keyBoardEvent = new KeyboardEvent(); 
    keyBoardEvent.Key = keyboard.ToString(); 
    keyList.Add(keyBoardEvent); 
    keyBoardEvent2 = new KeyboardEvent(); 
    keyBoardEvent2.Key = keyboard.ToString(); 
    myLogs.Add(keyBoardEvent2); 
} 

Et troisième approche serait d'utiliser la liste, mais pas de code ici compagnon.