Глобальный ключ /MouseHook с пользовательским интерфейсом

Я хочу сделать приложение C# с клавиатурой и мышью на экране.
Каждый ключ или кнопка, на которую нажимают, должны быть видны в этом приложении, например, путем окрашивания одной из клавиш (я знаю, как это сделать). Это также должно работать, если приложение не сфокусировано.
В настоящее время я использую глобальный Key- и Mousehook, который отлично работает.
Проблема в том, что Keyhook перехватывает только один ключ за раз, что означает, что я могу показывать только ключ за раз. Я хочу иметь возможность показывать несколько клавиш одновременно на экране. 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);
        }
    }

}

0 ответов

Другие вопросы по тегам