2009-06-11 13 views
0

キーボードストロークを記録したい。しかし、新しいキーボードをkeyListに追加すると、すべての項目が新しい項目に変更されます。たとえば、keyListにAとBが含まれていて、Cを入力すると、keyListはA、B、CではなくC、C、Cになります。CでのKeyLoggerの問題

あなたはこの問題の原因を知っていますか?リストを使うべきではありませんか?

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

リストでタイプを指定する必要はありませんか?すなわちリスト James

+0

タイプはキーメンバー(文字列)を持つオブジェクトであるKeyBoardEventです。 – paradisonoir

答えて

3

KeyboardEventはクラスであり、したがって「参照によって」渡されます。つまり、そのコピーは1つだけです。同じオブジェクトをリストに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); 
} 

そして第三のアプローチは、それがリストを使用することですが、ここではありませんコードは、チームメイト。