Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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# 带UI的全局键/鼠标指针_C#_User Interface_Global_Mouse Hook_Keyhook - Fatal编程技术网

C# 带UI的全局键/鼠标指针

C# 带UI的全局键/鼠标指针,c#,user-interface,global,mouse-hook,keyhook,C#,User Interface,Global,Mouse Hook,Keyhook,我想制作一个屏幕上有键盘和鼠标的C#应用程序。 在这个应用程序中,单击的每个键或按钮都应该通过对其中一个键着色(我知道怎么做)来查看。如果应用程序没有重点,这也应该起作用目前,我使用的是一个全局键和鼠标本,效果很好。 问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。 不幸的是,KeyListener没有选择,因为它们不在应用程序之外工作。 有人知道如何使这成为可能吗 这是我正在使用的钥匙钩: public class KeyHook {

我想制作一个屏幕上有键盘和鼠标的C#应用程序。
在这个应用程序中,单击的每个键或按钮都应该通过对其中一个键着色(我知道怎么做)来查看。如果应用程序没有重点,这也应该起作用
目前,我使用的是一个全局键和鼠标本,效果很好。

问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。 不幸的是,KeyListener没有选择,因为它们不在应用程序之外工作。 有人知道如何使这成为可能吗

这是我正在使用的钥匙钩:

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);
        }
    }

}
公共类KeyHook
{
私有委托int-HookProc(int-nCode、IntPtr-wParam、IntPtr-lParam);
静态int hHook=0;
公共静态列表键代码=新列表();
const int WH_键盘LL=13;
HookProc键盘hookprocedure;
[StructLayout(LayoutKind.Sequential)]
私有类keyboardHookStruct
{
公共int-vkCode;
公共int扫描码;
公共国旗;
公共整数时间;
公共信息;
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部int SetWindowsHookEx(int idHook、HookProc lpfn、,
IntPtr hInstance,int threadId);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部bool unhookwindowshookx(intidhook);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部内部调用nexthookex(内部idHook,内部nCode,
IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”)]
静态外部IntPtr加载库(字符串lpFileName);
公钥挂钩()
{
钩子();
}
~KeyHook()
{
解开钩();
}
公共int Hook()
{
KeyboardHookProcedure=新的HookProc(KeyHook.KeyboardHookProc);
hHook=SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,(IntPtr)加载库(“User32”),0);
返回hHook;
}
公共bool UnHook()
{
bool-ret=unhookwindowshookx(hHook);
如果(ret)
hHook=0;
返回ret;
}
私有静态int KeyboardHookProc(int nCode、IntPtr wParam、IntPtr lParam)
{
if(nCode<0)
{
返回CallNextHookEx(hHook、nCode、wParam、lParam);
}
其他的
{
如果((int)wParam==256)| |((int)wParam==260))
{
keyboardHookStruct MyKeyboardHookStruct=(keyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(keyboardHookStruct));
//将密钥添加到用于其他内容的日志
添加((键)MyKeyboardHookStruct.vkCode);
//在用户界面中为按键着色的代码
}
返回CallNextHookEx(hHook、nCode、wParam、lParam);
}
}
}

很奇怪,你用C语言编程,但是使用了旧的Win32的东西,你可以很容易地用C++ C++编码。“问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。“尽管钩子一次只截取一个键,但你不能跟踪哪些键被按下并同时显示所有键吗?”我问道“,还是在互联网上闲逛?你找到的代码有多旧?小心你没有发现古老的代码并认为这是做事情的正确方式。@Sam也许我可以,但不知怎的,我什么都没想到。。