3

我有一个低级键盘钩子,目前允许我从任何应用程序(包括游戏)内部控制媒体播放器。

它通过查看捕获的特定击键来工作。

我想扩展它来寻找键的组合。我可以硬编码一些逻辑,但我觉得必须有一种更合乎逻辑的方式。

真的,我正在寻找类似移位寄存器的东西......

例如,当我输入“BlahPlay”时,我想要一个可以像这样使用的结构......

[_,_,_,_]
[_,_,_,B]
[_,_,B,l]
[_,B,l,a]
[B,l,a,h]
[l,a,h,P]
[a,h,P,l]
[h,P,l,a]
[P,l,a,y] <-- detect "Play"

缺少循环和移动数组中的项目,这样做的正确方法是什么?

我现在能想到的最好的就是……

Private Register(4) As Char
Private Position = 0 

Sub Add(Character as Char)
    Register(Position) = Character
    Position = (Position + 1) Mod Register.Length
End Sub

Function Get() as String
    Dim Ret As New StringBuilder
    For i = Position To Position + Register.Length
        Ret.Append(Register(i Mod Register.Length)
    Next
    Return Ret.ToString
End Function
4

1 回答 1

1

您可以创建标准数组并将每个项目插入下一个位置,而不是移动缓冲区中的项目,并根据需要循环。考虑以下代码:

var buffSize = 4;
var position = 0;
var buffer = new char[buffSize];

现在您只需在每次输入新键时插入每个新字符position并设置。position = (position + 1) % buffSize假设您键入abcPlay,缓冲区将是:

[_,_,_,_] position = 0
[a,_,_,_] position = 1
[a,b,_,_] position = 2
[a,b,c,_] position = 3
[a,b,c,P] position = 0
[l,b,c,P] position = 1
[l,a,c,P] position = 2
[l,a,y,P] position = 3

这意味着不是简单地从开始读取每个字符读取position. 例如,如果您正在测试缓冲区是否包含Play,则必须执行以下操作:

var test = new char[] { 'P', 'l', 'a', 'y' };
int p = (position + buffSize - test.Length) % buffSize;
bool success = true;
for(int i = 0; i < test.Length; i++)
{
    if (buffer[p] != test[i])
    {
        success = false;
        break;
    }

    p = (p + 1) % buffSize;
}

编辑自从我开始写这个答案以来,你编辑了你的问题。看来您已经开发出非常接近此的解决方案。我仍然建议使用这样的东西。这将比在每次插入时移动数组中的每个项目更有效。

于 2013-08-04T17:30:03.830 回答