Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#开发键盘钩子解锁软件_C#_Keyboard Hook - Fatal编程技术网

如何使用c#开发键盘钩子解锁软件

如何使用c#开发键盘钩子解锁软件,c#,keyboard-hook,C#,Keyboard Hook,我正在尝试开发一个软件,它将接受键盘输入,使用输入,并返回一些其他字符,以改变键入的输入。例如,如果我键入:“abcd”并将交换规则定义为任何俄语字母,那么我希望输出为:“Саа” 我使用的代码如下: namespace hook_form { public partial class Form1 : Form { //Keyboard API constants private const int WH_KEYBOARD_LL = 13;

我正在尝试开发一个软件,它将接受键盘输入,使用输入,并返回一些其他字符,以改变键入的输入。例如,如果我键入:“abcd”并将交换规则定义为任何俄语字母,那么我希望输出为:“Саа”

我使用的代码如下:

namespace hook_form
{
    public partial class Form1 : Form
    {
        //Keyboard API constants

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;
        private const int WM_SYSKEYUP = 0x0105;
        private const int WM_SYSKEYDOWN = 0x0104;
        private HookHandlerDelegate proc;
        private IntPtr hookID = IntPtr.Zero;
        private delegate IntPtr HookHandlerDelegate(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);

        private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            int scanCode;
            public int flags;
            int time;
            int dwExtraInfo;
        }

        private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
        {
            bool AllowKey = false;

            switch (lParam.vkCode)
            {
                case (65|97|66|98): // key codes for "a/b/c/d" etc. goes here
                    //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key
                    AllowKey = true;
                    SendKeys.Send("\u0997"); // code for russian letters here....
                    break;
            }

            MessageBox.Show(lParam.vkCode.ToString());

            if (AllowKey == false)
                return (System.IntPtr)1;

            return CallNextHookEx(hookID, nCode, wParam, ref lParam);
        }
        #region DllImports

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, 
        HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
        IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName); 
        #endregion

        private void buttonStart_Click(object sender, EventArgs e)
        {
            proc = new HookHandlerDelegate(HookCallback);
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                hookID = SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        private void btnEnd_Click(object sender, EventArgs e)
        {
            UnhookWindowsHookEx(hookID);
        }
    }
}
我得到的输出是:“aСbčcčdč”,我的意思是,即使我返回了
(System.IntPtr)1
,代码也不会使用键入的字母(英语)(我的意思是它们不应该出现在输出中)

我认为这是一个脱钩的问题。有人能帮我解决这个问题吗


如果不可能,那么有人能告诉我任何使用键盘挂钩的开源软件吗?

在发送所需的新字符之前,发送一个退格键怎么样

AllowKey = true;
SendKeys.Send("{BS}");
SendKeys.Send("\u0997"); // code for russian letters here....
break;

尝试不要调用
CallNextHookEx
来处理您要吞咽的事件

编辑:
所以我看到的一个问题是按键会产生两个消息WM_KEYDOWN和WM_keydup。您正在为这两种情况注入新的键盘消息,并复制它。Tim Barras链接中的示例演示了如何更好地实现这一点。不过,这并不能完全解释您所看到的行为。

愚蠢的问题,难道您不能更改计算机上的俄语键盘布局吗?俄语只是一个例子:-S我只想知道执行此操作的技术。这实际上已经发生了,因为AllowKey为false时返回(IntPtr)1而不是CallNextHookEx()非常正确。我应该读一下密码。很多年前我就这样做了,我会努力找到源代码。谢谢donner…我总是看到代码,但没有注意到,你的回复帮助我抓住了要点。好的回答:-)