2009-06-11 4 views
0

키보드 스트로크를 기록하고 싶습니다. 그러나 keyList에 새 키보드를 추가하면 모든 항목이 새 목록으로 변경됩니다. 예를 들어 keyList에 A와 B가 들어 있고 C를 입력하면 내 keyList는 A, B, C 대신 C, C, C가됩니다.C#의 KeyLogger 문제

이 문제의 원인을 알고 계십니까? List를 사용해야하지 않습니까?

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

목록과 함께 유형을 지정하지 않아도됩니까? 즉 List James

+0

유형은 KeyBoardEvent이며 키 멤버 (문자열)가있는 객체입니다. – paradisonoir

답변

3

KeyboardEvent는 클래스이므로 "참조로 전달됩니다". 이것은 당신이 오직 하나의 복사본을 가지고 있음을 의미합니다. 같은 개체를 목록에 3 번 추가하고 있습니다.

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

목록은 이제 포함됩니다 : C는 C, C

는,이 문제를 해결 함수에 myKeyBoardEvent 지역 만들기 단지 새로운 KeyboardEvent입니다을 만들려면

이 같은 영향을 미칠 것 매번.

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

감사합니다. – paradisonoir

0

이 기본 문제 : 다음

는 고정 된 버전입니다. myKeyBoardEvent은 값이 아니며이 목록에는 동일한 객체에 대한 참조가 포함되어 있습니다.

올바른 구현은 다음과 같습니다 여기

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

가 작동하지만 myLogs 목록 개체를 변경하면 너무 키리스트에 변경됩니다. 다른 접근 방법은 더 많은 메모리를 차지하지만 변화에서 고정됩니다

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

그리고 세 번째 방법은이 목록을 사용하는 것입니다 만, 여기에 어떤 코드가 동료.