使用焦点控制键输出到应用程序

时间:2013-08-06 18:06:42

标签: c# hook

我想要捕获正在键入的内容并以较慢的速率释放它。换句话说,如果有人以每分钟100次的速度打字,我希望他们输入的文字只能以每周60次的速度出现。

我一直把我的代码基于this article

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)是任意的,除了测试之外,服务器没有用处。

感谢您的帮助!

0 个答案:

没有答案