我想捕捉正在输入的内容并以较慢的速度释放它。换句话说,如果有人以 100 wpm 的速度打字,我希望他们输入的文本仅以 60 wpm 的速度出现。
我的代码很大程度上基于这篇文章。
CallNextHookEx(_hookID, nCode, wParam, lParam);
是什么决定一个键是否出现在应用程序上。我试过制作这样的自定义类:
public class KeyOutput
{
public int vkcode;
public int nCode;
public IntPtr wParam;
public IntPtr lParam;
public KeyOutput(int in_vkcode, int in_code, IntPtr in_wParam, IntPtr in_lParam)
{
vkcode = in_vkcode;
nCode = in_code;
wParam = in_wParam;
lParam = in_lParam;
}
public int Getvkcode
{
get
{
return vkcode;
}
}
public int Getcode
{
get
{
return nCode;
}
}
public IntPtr GetwParam
{
get
{
return wParam;
}
}
public IntPtr GetlParam
{
get
{
return lParam;
}
}
}
我这样做是希望通过保存 nCode、wParam、lParam 我可以简单地调用CallNextHookEx
它并显示字符。当我尝试遍历我的项目时,List<KeyOutput>
它只会显示最后一个被按下的字符,其余的都不显示。
我已经HookCallback
这样修改了(它当前在他们输入时显示文本):
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
KeyOutput key = new KeyOutput(vkCode, nCode, wParam, lParam);
listout.Add(key);
Console.WriteLine((Keys)vkCode);
}
if (listout.Count == 8)
{
foreach (KeyOutput key in listout)
{
Console.WriteLine((Keys)key.Getvkcode);
CallNextHookEx(_hookID, key.Getcode, key.GetwParam, key.GetlParam);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
if(listout.Count == 8)
是任意的,服务器除了测试之外没有其他目的。
感谢您提供的任何帮助!