首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的KeyLogger问题

C#中的KeyLogger问题
EN

Stack Overflow用户
提问于 2009-06-11 14:59:49
回答 2查看 724关注 0票数 0

我想记录我的键盘击打。但是,当我向keyList添加新键盘时,它会将所有项目更改为新键盘。例如,如果keyList包含A和B,并且我键入C,那么我的keyList将是C,C,C而不是A,B,C。

你知道是什么导致了这个问题吗?我不应该使用List吗?

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-11 15:04:59

KeyboardEvent是一个类,因此“通过引用”传递。这意味着你只有一份副本。您正在将同一对象添加到列表中3次。

这也会有相同的效果:

代码语言:javascript
复制
myKeyBoardEvent.Key = "A";
myLogs.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
myKeyBoardEvent.Key = "C";

列表现在将包含: C、C、C

要解决此问题,请将myKeyBoardEvent设置为函数的本地,并且每次只创建一个新的KeyboardEvent。

下面是一个固定的版本:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2009-06-11 15:07:03

这是一个基本的问题。myKeyBoardEvent是一个引用而不是一个值,list包含对同一对象的引用。

正确的实现应该是:

代码语言:javascript
复制
public void LogKeyboadEvent(Key keyboard)
{
    keyBoardEvent = new KeyboardEvent();
    keyBoardEvent.Key = keyboard.ToString();
    keyList.Add(keyBoardEvent);
    myLogs.Add(keyBoardEvent);
}

在这里它可以工作,但是更改myLogs列表上的对象也会更改keyList上的对象。其他方法将占用更多内存,但将保护它不受更改的影响:

代码语言:javascript
复制
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);
}

第三种方法是使用List,但这里没有代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/981641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档