0

我想在屏幕上制作一个带有键盘和鼠标的 C# 应用程序。
每个被点击的键或按钮都应该在这个应用程序中看到,例如为其中一个键着色(我知道怎么做)。如果应用程序没有聚焦,这也应该有效。
目前我正在使用一个工作正常的全局键和鼠标钩。
问题是,Keyhook 一次只能拦截一个 Key,这意味着我一次只能在 Key 上显示。我希望能够在屏幕上一次显示多个键。不幸的是,KeyListeners 是没有选择的,因为它们不能在应用程序之外工作。有谁知道如何使这成为可能?

这是我正在使用的 KeyHook:

public class KeyHook
{
    private delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

    static int hHook = 0;

    public static List<Keys> KeyCodes = new List<Keys>();

    const int WH_KEYBOARD_LL = 13;

    HookProc KeyboardHookProcedure;

    [StructLayout(LayoutKind.Sequential)]
    private class keyboardHookStruct
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto,
     CallingConvention = CallingConvention.StdCall)]
    private static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
    IntPtr hInstance, int threadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto,
     CallingConvention = CallingConvention.StdCall)]
    private static extern bool UnhookWindowsHookEx(int idHook);

    [DllImport("user32.dll", CharSet = CharSet.Auto,
     CallingConvention = CallingConvention.StdCall)]
    private static extern int CallNextHookEx(int idHook, int nCode,
    IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll")]
    static extern IntPtr LoadLibrary(string lpFileName);

    public KeyHook()
    {
        Hook();
    }

    ~KeyHook()
    {
        UnHook();
    }

    public int Hook()
    {
        KeyboardHookProcedure = new HookProc(KeyHook.KeyboardHookProc);

        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, (IntPtr)LoadLibrary("User32"), 0);
        return hHook;
    }

    public bool UnHook()
    {
        bool ret = UnhookWindowsHookEx(hHook);
        if (ret)
            hHook = 0;
        return ret;
    }

    private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode < 0)
        {
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }
        else
        {

            if (((int)wParam == 256) || ((int)wParam == 260))
            {
                keyboardHookStruct MyKeyboardHookStruct = (keyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(keyboardHookStruct));
                //Adding Key to a log i use for other stuff
                KeyCodes.Add((Keys)MyKeyboardHookStruct.vkCode);
                //Code for coloring Key in the UI for pressed Key
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }
    }

}
4

0 回答 0