2009-06-11 11 views
0

Ich möchte meine Tastaturanschläge protokollieren. Wenn ich keyList jedoch eine neue Tastatur hinzufüge, werden alle Elemente in das neue geändert. Zum Beispiel, wenn keyList A und B enthält und ich C schreibe, würde meine keyList C, C, C statt A, B, C.Problem mit KeyLogger in C#

wissen Sie, was dieses Problem verursacht? Sollte ich nicht Liste verwenden?

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

Müssen Sie keinen Typ mit der Liste angeben? d. h. Liste James

+0

Die Typen sind KeyBoardEvent, das ein Objekt ist, das ein Schlüsselelement (Zeichenfolge) hat. – paradisonoir

Antwort

3

KeyboardEvent ist eine Klasse und daher "per Referenz" bestanden. Dies bedeutet, dass Sie immer nur eine Kopie davon haben. Sie fügen das gleiche Objekt der Liste 3 mal hinzu.

Dies hätte auch den gleichen Effekt:

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

Liste enthält jetzt: C, C, C

Um dies zu beheben, die myKeyBoardEvent lokal für die Funktion machen und erstellen Sie einfach eine neue Keyboard jedes Mal. Hier

ist eine feste Version:

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

danke das hat sehr gut funktioniert. – paradisonoir

0

Dies ist ein grundlegendes Problem. myKeyBoardEvent ist ein Verweis kein Wert und eine Liste enthält einen Verweis auf das gleiche Objekt.

Der korrekte Umsetzung wäre:

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

Hier wird es funktionieren, aber auf der mylogs Liste Objekt zu ändern, wird es zu auf dem keyList ändern. Anderer Ansatz wird mehr Speicher nehmen, aber es wird von Änderungen sichern:

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); 
} 

Und dritter Ansatz wäre es Liste zu verwenden, aber kein Code hier paaren.