带UI的Global Key / MouseHook

时间:2013-03-14 23:58:49

标签: c# user-interface global mouse-hook keyhook

我想在屏幕上制作一个带键盘和鼠标的C#应用​​程序 点击的每个键或按钮都应在此应用程序中看到,例如着色其中一个键(我知道如何操作)。如果应用程序没有集中,这也应该有效。
目前我使用的是全球Key-and Mousehook,工作正常 问题是,Keyhook一次只拦截一个密钥,这意味着我一次只能在密钥上显示。我希望能够在屏幕上一次显示多个键。 遗憾的是,KeyListeners没有选项,因为它们不在Application之外工作。 有没有人知道如何使这成为可能?

这是我正在使用的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 个答案:

没有答案