简体   繁体   English

C#中的KeyLogger问题

[英]Problem with KeyLogger in C#

I want to log my keyboard strokes. 我想记录我的键盘笔触。 However, when I add a new keyboard to keyList, it changes all items to the new one. 但是,当我将新键盘添加到keyList时,它将所有项目更改为新键盘。 For example, if keyList contains A and B, and I type C, then my keyList would C, C ,C instead of A,B,C. 例如,如果keyList包含A和B,并且我键入C,则我的keyList将为C,C,C而不是A,B,C。

do you know what causing this problem? 您知道造成此问题的原因吗? Shouldn't I use List ? 我不应该使用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);
}

KeyboardEvent is a class, and therefore passed "by reference". KeyboardEvent是一个类,因此“通过引用”传递。 This means that you only ever have one copy of it. 这意味着您只能拥有一份。 You are adding the same object to the list 3 times. 您将同一对象添加到列表3次。

This would also have the same effect: 这也将具有相同的效果:

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

List will now contain: C, C, C 列表现在将包含:C,C,C

To fix this, make the myKeyBoardEvent local to the function and just create a new KeyboardEvent each time. 要解决此问题,请将myKeyBoardEvent设置为该函数的本地变量,然后每次仅创建一个新的KeyboardEvent。

Here is a fixed 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);
}

This is basic problem. 这是基本问题。 myKeyBoardEvent is a refference not a value and list contains reference to the same object. myKeyBoardEvent是一个引用,而不是值,并且列表包含对同一对象的引用。

Correct implementation would be: 正确的实现将是:

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

Here it will work, BUT changing object on the myLogs list will change it on the keyList too. 在这里它将起作用,但是myLogs列表上的更改对象也会在keyList上对其进行更改。 Other approach will take more memory, but will secure it from changes: 其他方法将占用更多内存,但可以保护其免受更改:

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

And third approach it would be to use List, but no code here mate. 第三种方法是使用List,但是这里没有代码匹配。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM