Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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/2/linux/23.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# mono csharp linux(ubuntu)全局钩子键盘_C#_Linux_Mono_Hook_Xorg - Fatal编程技术网

C# mono csharp linux(ubuntu)全局钩子键盘

C# mono csharp linux(ubuntu)全局钩子键盘,c#,linux,mono,hook,xorg,C#,Linux,Mono,Hook,Xorg,我需要在mono csharp中实现全局钩子,我阅读xkeyhook xkeyhookkeybord。。。无工作所有样品( 让我思考如何最好地实施。。。。 谢谢* 过滤不返回,即使是..要做什么???GDK过滤器不是设计为全局挂钩的。它们只会给您在正常处理之前已经传递到流程的事件 要安排将特定组合键的键盘事件发送到进程,请在根窗口中使用XGrabKey函数。请注意,有些事情通常不被视为“修饰符”,例如CapsLock,被X11视为修饰符,您需要抓住所有可能的修饰符配置,以便忽略它们。您也可能会发

我需要在mono csharp中实现全局钩子,我阅读xkeyhook xkeyhookkeybord。。。无工作所有样品( 让我思考如何最好地实施。。。。 谢谢*


过滤不返回,即使是..要做什么???

GDK过滤器不是设计为全局挂钩的。它们只会给您在正常处理之前已经传递到流程的事件

要安排将特定组合键的键盘事件发送到进程,请在根窗口中使用XGrabKey函数。请注意,有些事情通常不被视为“修饰符”,例如CapsLock,被X11视为修饰符,您需要抓住所有可能的修饰符配置,以便忽略它们。您也可能会发现它们很有用

X在设计时没有考虑全局键盘或鼠标挂钩。虽然可以将所有事件传递到您的进程,但如果不干扰其他进程,则无法完成此操作。

public delegate void SpecialKeyPressedHandler(对象o,SpecialKey键);
 public delegate void SpecialKeyPressedHandler(object o, SpecialKey key);

    public enum SpecialKey 
    {
        one = Gdk.Key.exclam,
        two = Gdk.Key.at,
        tree = Gdk.Key.numbersign,
        four = Gdk.Key.dollar,
        five = Gdk.Key.percent,
        six = Gdk.Key.asciicircum,
        seven = Gdk.Key.ampersand,
        eight = Gdk.Key.asterisk,
        nine = Gdk.Key.parenleft,
        nul = Gdk.Key.parenright,
        retu = Gdk.Key.Return

    };

    public class SpecialKeys
    {
        private Hashtable key_map = new Hashtable();
        private Hashtable key_registrations = new Hashtable();
        private IEnumerable keycode_list;
        private TimeSpan raise_delay = new TimeSpan(0);
        private DateTime last_raise = DateTime.MinValue;

        public SpecialKeys()
        {
            Console.WriteLine("init");
            keycode_list = BuildKeyCodeList();
            InitializeKeys();
        }

        public void Dispose()
        {
            UnitializeKeys();
        }

        public void RegisterHandler(SpecialKeyPressedHandler handler, params SpecialKey [] specialKeys)
        {
            foreach(SpecialKey specialKey in specialKeys) {
                if(key_map.Contains(specialKey)) {
                    int key = (int)key_map[specialKey];
                    key_registrations[key] = Delegate.Combine(key_registrations[key] as Delegate, handler);
                }
            }
        }

        public void UnregisterHandler(SpecialKeyPressedHandler handler, params SpecialKey [] specialKeys)
        {
            foreach(SpecialKey specialKey in specialKeys) {
                if(key_map.Contains(specialKey)) {
                    int key = (int)key_map[specialKey];
                    key_registrations[key] = Delegate.Remove(key_registrations[key] as Delegate, handler); 
                }
            }
        }

        private IEnumerable BuildKeyCodeList()
        {
            ArrayList kc_list = new ArrayList();

            foreach(SpecialKey key in Enum.GetValues(typeof(SpecialKey))) {
                IntPtr xdisplay = gdk_x11_get_default_xdisplay();

                if(!xdisplay.Equals(IntPtr.Zero)) {
                    int keycode = XKeysymToKeycode(xdisplay, key);
                    if(keycode != 0) {
                        key_map[keycode] = key;
                        key_map[key] = keycode;
                        kc_list.Add(keycode);
                    }
                }
            }
            return kc_list;
        }

        private void InitializeKeys()
        {
            for(int i = 0; i < Gdk.Display.Default.NScreens; i++) {
                Gdk.Screen screen = Gdk.Display.Default.GetScreen(i);

                foreach(int keycode in keycode_list) {
                    GrabKey(screen.RootWindow, keycode);
                }
                screen.RootWindow.AddFilter(FilterKey);
            }


        }

        private void UnitializeKeys() 
        {
            for(int i = 0; i < Gdk.Display.Default.NScreens; i++) {
                Gdk.Screen screen = Gdk.Display.Default.GetScreen(i);
                foreach(int keycode in keycode_list) {
                    UngrabKey(screen.RootWindow, keycode);
                }
                screen.RootWindow.RemoveFilter(FilterKey);
            }
        }

        private void GrabKey(Gdk.Window root, int keycode)
        {   

            IntPtr xid = gdk_x11_drawable_get_xid(root.Handle);
            IntPtr xdisplay = gdk_x11_get_default_xdisplay();

            gdk_error_trap_push();

            XGrabKey(xdisplay, keycode, XModMask.None, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod2, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod5, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod5 | XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async);
            XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5 | XModMask.Lock, xid, true, 
                XGrabMode.Async, XGrabMode.Async);

            gdk_flush();

            if(gdk_error_trap_pop() != 0) {
                Console.Error.WriteLine(": Could not grab key {0} (maybe another application has grabbed this key)", keycode);
            }
        }

        private void UngrabKey(Gdk.Window root, int keycode)
        {
            IntPtr xid = gdk_x11_drawable_get_xid(root.Handle);
            IntPtr xdisplay = gdk_x11_get_default_xdisplay();

            gdk_error_trap_push();

            XUngrabKey(xdisplay, keycode, XModMask.None, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod2, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod5, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Lock, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Lock, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod5 | XModMask.Lock, xid);
            XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5 | XModMask.Lock,xid);

            gdk_flush();

            if(gdk_error_trap_pop() != 0) {
                Console.Error.WriteLine(": Could not ungrab key {0} (maybe another application has grabbed this key)", keycode);
            }
        }

        private Gdk.FilterReturn FilterKey(IntPtr xeventPtr, Gdk.Event gdkEvent)
        {
            Console.WriteLine("filter "+ gdkEvent.Type);
            if(DateTime.Now - last_raise < raise_delay) {
                return Gdk.FilterReturn.Continue;
            }

            last_raise = DateTime.Now;

            XKeyEvent xevent = (XKeyEvent)Marshal.PtrToStructure(xeventPtr, typeof(XKeyEvent));

            if(xevent.type != XEventName.KeyPress) {
                return Gdk.FilterReturn.Continue;
            }

            int keycode = (int)xevent.keycode;
            object x = key_map[keycode];

            Console.WriteLine("filter "+ keycode);

            if(x == null) {
                return Gdk.FilterReturn.Continue;
            }

            SpecialKey key = (SpecialKey)key_map[keycode];

            if(key_registrations[keycode] != null) {
                x = key_registrations[keycode];
                if(x is SpecialKeyPressedHandler) {
                    ((SpecialKeyPressedHandler)x)(this, key);    
                }
                return Gdk.FilterReturn.Remove;
            }

            return Gdk.FilterReturn.Continue;
        }

        public TimeSpan Delay {
            get {
                return raise_delay;
            }

            set {
                raise_delay = value;
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct XKeyEvent
        {
            public XEventName type;
            public IntPtr serial;
            public bool send_event;
            public IntPtr display;
            public IntPtr window;
            public IntPtr root;
            public IntPtr subwindow;
            public IntPtr time;
            public int x;
            public int y;
            public int x_root;
            public int x_y;
            public uint state;
            public uint keycode;
            public bool same_screen;
        }

        [DllImport("libX11")]
        private static extern int XKeysymToKeycode(IntPtr display, SpecialKey keysym);

        [DllImport("libX11")]
        private static extern void XGrabKey(IntPtr display, int keycode, XModMask modifiers, 
            IntPtr window, bool owner_events, XGrabMode pointer_mode, XGrabMode keyboard_mode);

        [DllImport("libX11")]
        private static extern void XUngrabKey(IntPtr display, int keycode, XModMask modifiers, 
            IntPtr window);

        [DllImport("gdk-x11-2.0")]
        private static extern IntPtr gdk_x11_drawable_get_xid(IntPtr window);

        [DllImport("gdk-x11-2.0")]
        private static extern IntPtr gdk_x11_get_default_xdisplay();

        [DllImport("gdk-x11-2.0")]
        private static extern void gdk_error_trap_push();

        [DllImport("gdk-x11-2.0")]
        private static extern int gdk_error_trap_pop();

        [DllImport("gdk-x11-2.0")]
        private static extern void gdk_flush();

        [Flags]
        private enum XModMask {
            None    = 0,
            Shift   = 1 << 0,
            Lock    = 1 << 1,
            Control = 1 << 2,
            Mod1    = 1 << 3,
            Mod2    = 1 << 4,
            Mod3    = 1 << 5,
            Mod4    = 1 << 6,
            Mod5    = 1 << 7
        }

        private enum XGrabMode {
            Sync  = 0,
            Async = 1
        }

        private enum XEventName {
            KeyPress   = 2,
            KeyRelease = 3,
        }
    }
公共枚举专用项 { 一=Gdk.Key.惊叹号, 二=Gdk.Key.at, tree=Gdk.Key.numbersign, 四美元=Gdk.Key.dollar, 五=Gdk.Key.percent, 六=Gdk.Key.ascicircum, 七=Gdk.Key.ampersand, 八=Gdk.Key.asterisk, 九=Gdk.Key.parenleft, nul=Gdk.Key.parenright, retu=Gdk.Key.Return }; 公共课专用课 { 私有哈希表key_map=新哈希表(); 私有哈希表key_registrations=新哈希表(); 私有IEnumerable密钥码列表; 专用时间间隔raise_delay=新时间间隔(0); private DateTime last_raise=DateTime.MinValue; 公共特价商品() { Console.WriteLine(“初始”); keycode_list=BuildKeyCodeList(); InitializeKeys(); } 公共空间处置() { Unitalizekeys(); } 公共无效注册表句柄(SpecialKeyPressedHandler,参数SpecialKey[]specialKeys) { foreach(SpecialKey SpecialKey in SpecialKey){ if(键映射包含(特殊键)){ int key=(int)key_map[specialKey]; key\u registrations[key]=委托.合并(key\u registrations[key]作为委托,处理程序); } } } public void UnregisterHandler(SpecialKeyPressedHandler,参数SpecialKey[]specialKeys) { foreach(SpecialKey SpecialKey in SpecialKey){ if(键映射包含(特殊键)){ int key=(int)key_map[specialKey]; key\u registrations[key]=委托。删除(key\u registrations[key]作为委托,处理程序); } } } 私有IEnumerable BuildKeyCodeList() { ArrayList kc_list=新的ArrayList(); foreach(Enum.GetValues中的SpecialKey(typeof(SpecialKey))){ IntPtr xdisplay=gdk_x11_get_default_xdisplay(); 如果(!xdisplay.Equals(IntPtr.Zero)){ int keycode=XKeysymToKeycode(xdisplay,key); 如果(键码!=0){ 键映射[keycode]=键; 键映射[键]=键代码; kc_列表。添加(键码); } } } 返回kc_列表; } 私有void InitializeKeys() { 对于(int i=0;i public delegate void SpecialKeyPressedHandler(object o, SpecialKey key); public enum SpecialKey { one = Gdk.Key.exclam, two = Gdk.Key.at, tree = Gdk.Key.numbersign, four = Gdk.Key.dollar, five = Gdk.Key.percent, six = Gdk.Key.asciicircum, seven = Gdk.Key.ampersand, eight = Gdk.Key.asterisk, nine = Gdk.Key.parenleft, nul = Gdk.Key.parenright, retu = Gdk.Key.Return }; public class SpecialKeys { private Hashtable key_map = new Hashtable(); private Hashtable key_registrations = new Hashtable(); private IEnumerable keycode_list; private TimeSpan raise_delay = new TimeSpan(0); private DateTime last_raise = DateTime.MinValue; public SpecialKeys() { Console.WriteLine("init"); keycode_list = BuildKeyCodeList(); InitializeKeys(); } public void Dispose() { UnitializeKeys(); } public void RegisterHandler(SpecialKeyPressedHandler handler, params SpecialKey [] specialKeys) { foreach(SpecialKey specialKey in specialKeys) { if(key_map.Contains(specialKey)) { int key = (int)key_map[specialKey]; key_registrations[key] = Delegate.Combine(key_registrations[key] as Delegate, handler); } } } public void UnregisterHandler(SpecialKeyPressedHandler handler, params SpecialKey [] specialKeys) { foreach(SpecialKey specialKey in specialKeys) { if(key_map.Contains(specialKey)) { int key = (int)key_map[specialKey]; key_registrations[key] = Delegate.Remove(key_registrations[key] as Delegate, handler); } } } private IEnumerable BuildKeyCodeList() { ArrayList kc_list = new ArrayList(); foreach(SpecialKey key in Enum.GetValues(typeof(SpecialKey))) { IntPtr xdisplay = gdk_x11_get_default_xdisplay(); if(!xdisplay.Equals(IntPtr.Zero)) { int keycode = XKeysymToKeycode(xdisplay, key); if(keycode != 0) { key_map[keycode] = key; key_map[key] = keycode; kc_list.Add(keycode); } } } return kc_list; } private void InitializeKeys() { for(int i = 0; i < Gdk.Display.Default.NScreens; i++) { Gdk.Screen screen = Gdk.Display.Default.GetScreen(i); foreach(int keycode in keycode_list) { GrabKey(screen.RootWindow, keycode); } screen.RootWindow.AddFilter(FilterKey); } } private void UnitializeKeys() { for(int i = 0; i < Gdk.Display.Default.NScreens; i++) { Gdk.Screen screen = Gdk.Display.Default.GetScreen(i); foreach(int keycode in keycode_list) { UngrabKey(screen.RootWindow, keycode); } screen.RootWindow.RemoveFilter(FilterKey); } } private void GrabKey(Gdk.Window root, int keycode) { IntPtr xid = gdk_x11_drawable_get_xid(root.Handle); IntPtr xdisplay = gdk_x11_get_default_xdisplay(); gdk_error_trap_push(); XGrabKey(xdisplay, keycode, XModMask.None, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod2, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod5, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod5 | XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async); XGrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5 | XModMask.Lock, xid, true, XGrabMode.Async, XGrabMode.Async); gdk_flush(); if(gdk_error_trap_pop() != 0) { Console.Error.WriteLine(": Could not grab key {0} (maybe another application has grabbed this key)", keycode); } } private void UngrabKey(Gdk.Window root, int keycode) { IntPtr xid = gdk_x11_drawable_get_xid(root.Handle); IntPtr xdisplay = gdk_x11_get_default_xdisplay(); gdk_error_trap_push(); XUngrabKey(xdisplay, keycode, XModMask.None, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod2, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod5, xid); XUngrabKey(xdisplay, keycode, XModMask.Lock, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Lock, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod5 | XModMask.Lock, xid); XUngrabKey(xdisplay, keycode, XModMask.Mod2 | XModMask.Mod5 | XModMask.Lock,xid); gdk_flush(); if(gdk_error_trap_pop() != 0) { Console.Error.WriteLine(": Could not ungrab key {0} (maybe another application has grabbed this key)", keycode); } } private Gdk.FilterReturn FilterKey(IntPtr xeventPtr, Gdk.Event gdkEvent) { Console.WriteLine("filter "+ gdkEvent.Type); if(DateTime.Now - last_raise < raise_delay) { return Gdk.FilterReturn.Continue; } last_raise = DateTime.Now; XKeyEvent xevent = (XKeyEvent)Marshal.PtrToStructure(xeventPtr, typeof(XKeyEvent)); if(xevent.type != XEventName.KeyPress) { return Gdk.FilterReturn.Continue; } int keycode = (int)xevent.keycode; object x = key_map[keycode]; Console.WriteLine("filter "+ keycode); if(x == null) { return Gdk.FilterReturn.Continue; } SpecialKey key = (SpecialKey)key_map[keycode]; if(key_registrations[keycode] != null) { x = key_registrations[keycode]; if(x is SpecialKeyPressedHandler) { ((SpecialKeyPressedHandler)x)(this, key); } return Gdk.FilterReturn.Remove; } return Gdk.FilterReturn.Continue; } public TimeSpan Delay { get { return raise_delay; } set { raise_delay = value; } } [StructLayout(LayoutKind.Sequential)] private struct XKeyEvent { public XEventName type; public IntPtr serial; public bool send_event; public IntPtr display; public IntPtr window; public IntPtr root; public IntPtr subwindow; public IntPtr time; public int x; public int y; public int x_root; public int x_y; public uint state; public uint keycode; public bool same_screen; } [DllImport("libX11")] private static extern int XKeysymToKeycode(IntPtr display, SpecialKey keysym); [DllImport("libX11")] private static extern void XGrabKey(IntPtr display, int keycode, XModMask modifiers, IntPtr window, bool owner_events, XGrabMode pointer_mode, XGrabMode keyboard_mode); [DllImport("libX11")] private static extern void XUngrabKey(IntPtr display, int keycode, XModMask modifiers, IntPtr window); [DllImport("gdk-x11-2.0")] private static extern IntPtr gdk_x11_drawable_get_xid(IntPtr window); [DllImport("gdk-x11-2.0")] private static extern IntPtr gdk_x11_get_default_xdisplay(); [DllImport("gdk-x11-2.0")] private static extern void gdk_error_trap_push(); [DllImport("gdk-x11-2.0")] private static extern int gdk_error_trap_pop(); [DllImport("gdk-x11-2.0")] private static extern void gdk_flush(); [Flags] private enum XModMask { None = 0, Shift = 1 << 0, Lock = 1 << 1, Control = 1 << 2, Mod1 = 1 << 3, Mod2 = 1 << 4, Mod3 = 1 << 5, Mod4 = 1 << 6, Mod5 = 1 << 7 } private enum XGrabMode { Sync = 0, Async = 1 } private enum XEventName { KeyPress = 2, KeyRelease = 3, } }