Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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_Format_Hook - Fatal编程技术网

C# 我的键盘挂钩提供了奇怪的反馈

C# 我的键盘挂钩提供了奇怪的反馈,c#,keyboard,format,hook,C#,Keyboard,Format,Hook,我使用以下代码作为键盘挂钩。它应该保存我输入的所有东西。我的问题是,它给出了一些非常奇怪的东西,它只是写大写 using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows.Forms; public class GlobalKeyboardHook { [DllImport("user32.d

我使用以下代码作为键盘挂钩。它应该保存我输入的所有东西。我的问题是,它给出了一些非常奇怪的东西,它只是写大写

using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;   

public class GlobalKeyboardHook
{
    [DllImport("user32.dll")]
    static extern int CallNextHookEx(IntPtr hhk, int code, int wParam, ref keyBoardHookStruct lParam);
    [DllImport("user32.dll")]
    static extern IntPtr SetWindowsHookEx(int idHook, LLKeyboardHook callback, IntPtr hInstance, uint theardID);
    [DllImport("user32.dll")]
    static extern bool UnhookWindowsHookEx(IntPtr hInstance);
    [DllImport("kernel32.dll")]
    static extern IntPtr LoadLibrary(string lpFileName);

    public delegate int LLKeyboardHook(int Code, int wParam, ref keyBoardHookStruct lParam);

    public struct keyBoardHookStruct
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }

    const int WH_KEYBOARD_LL = 13;
    const int WM_KEYDOWN = 0x0100;
    const int WM_KEYUP = 0x0101;
    const int WM_SYSKEYDOWN = 0x0104;
    const int WM_SYSKEYUP = 0x0105;

    LLKeyboardHook llkh;
    public List<Keys> HookedKeys = new List<Keys>();

    IntPtr Hook = IntPtr.Zero;

    public event KeyEventHandler KeyDown;
    public event KeyEventHandler KeyUp;

    // This is the Constructor. This is the code that runs every time you create a new GlobalKeyboardHook object
    public GlobalKeyboardHook()
    {
        llkh = new LLKeyboardHook(HookProc);
        // This starts the hook. You can leave this as comment and you have to start it manually (the thing I do in the tutorial, with the button)
        // Or delete the comment mark and your hook will start automatically when your program starts (because a new GlobalKeyboardHook object is created)
        // That's why there are duplicates, because you start it twice! I'm sorry, I haven't noticed this...
        // hook(); <-- Choose!
    }
    ~GlobalKeyboardHook()
    { unhook(); }

    public void hook()
    {
        IntPtr hInstance = LoadLibrary("User32");
        Hook = SetWindowsHookEx(WH_KEYBOARD_LL, llkh, hInstance, 0);
    }

    public void unhook()
    {
        UnhookWindowsHookEx(Hook);
    }

    public int HookProc(int Code, int wParam, ref keyBoardHookStruct lParam)
    {
        if (Code >= 0)
        {
            Keys key = (Keys)lParam.vkCode;
            if (HookedKeys.Contains(key))
            {
                KeyEventArgs kArg = new KeyEventArgs(key);
                if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
                    KeyDown(this, kArg);
                else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
                    KeyUp(this, kArg);
                if (kArg.Handled)
                    return 1;
            }
        }
        return CallNextHookEx(Hook, Code, wParam, ref lParam);
    }

}
使用系统;
使用系统文本;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
公共类GlobalKeyboardHook
{
[DllImport(“user32.dll”)]
静态extern int CallNextHookEx(IntPtr hhk、int代码、int wParam、ref keyBoardHookStruct lParam);
[DllImport(“user32.dll”)]
静态外部IntPtr SETWINDOWSHOOKX(int idHook、LLKeyboardHook回调、IntPtr hInstance、uint theardID);
[DllImport(“user32.dll”)]
静态外部bool unhookwindowshookx(IntPtr hInstance);
[DllImport(“kernel32.dll”)]
静态外部IntPtr加载库(字符串lpFileName);
公共委托int LLKeyboardHook(int代码、int wParam、ref keyBoardHookStruct lParam);
公共结构keyBoardHookStruct
{
公共int-vkCode;
公共int扫描码;
公共国旗;
公共整数时间;
公共信息;
}
const int WH_键盘LL=13;
常量int WM_KEYDOWN=0x0100;
常数int WM_KEYUP=0x0101;
常量int WM_SYSKEYDOWN=0x0104;
常量int WM_SYSKEYUP=0x0105;
LLKeyboardHook-llkh;
public List HookedKeys=新列表();
IntPtr Hook=IntPtr.Zero;
公共事件KeyEventHandler KeyDown;
公共事件KeyEventHandler KeyUp;
//这是构造函数。这是每次创建新的GlobalKeyboardHook对象时运行的代码
公共GlobalKeyboardHook()
{
llkh=新的LLKeyboardHook(HookProc);
//这将启动钩子。您可以将其保留为注释,您必须手动启动它(我在教程中使用的按钮)
//或者删除注释标记,程序启动时钩子将自动启动(因为创建了新的GlobalKeyboardHook对象)
//这就是为什么会有重复的,因为你启动了两次!对不起,我没有注意到这个。。。
//hook();=0)
{
Keys key=(Keys)lParam.vkCode;
if(HookedKeys.Contains(键))
{
KeyEventArgs kArg=新的KeyEventArgs(键);
if((wParam==WM|u KEYDOWN | wParam==WM_SYSKEYDOWN)&&(KEYDOWN!=null))
按键(这个,卡格);
else if((wParam==WM|u-KEYUP | wParam==WM_-SYSKEYUP)&&(KEYUP!=null))
凯普(这个,卡格);
如果(卡丁车已处理)
返回1;
}
}
返回CallNextHookEx(钩子、代码、wParam、ref lParam);
}
}
现在,这里是我的输入和输出:(对不起德语,但它显示了我的问题所在;)

输入:wie gesagt:

输出:WIE GEE GESAGT¾


如果有人能给我一点提示来解决这个问题,那就太好了:)

我认为问题不在后端代码中,而是在使用itA键盘的代码中,hook看到的是虚拟键,而不是字符。因此,您没有注意修改器关键点的状态。显然,也没有处理退格问题。再加上一些utf-8编码的麻烦,就更难弄清楚你做了什么。