我有一个低级键盘钩子,目前允许我从任何应用程序内部控制媒体播放器,包括游戏。
通过查看捕获的特定击键来工作。
我想扩展它以寻找键的组合。我可以对一些逻辑进行硬编码,但我觉得必须采用更合乎逻辑的方式。
真的,我正在寻找像移位寄存器......
例如,当我输入“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
答案 0 :(得分: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;
}
编辑自从我开始撰写此答案以来,您编辑了自己的问题。看来你已经开发了一个非常接近这个的解决方案。我仍然建议你这样做。它比在每个插入上移动数组中的每个项目更有效。