0

我想捕捉正在输入的内容并以较慢的速度释放它。换句话说,如果有人以 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)是任意的,服务器除了测试之外没有其他目的。

感谢您提供的任何帮助!

4

0 回答 0