c# - 如何从代码隐藏发送多个击键

标签 c# wpf

我正在尝试从代码后面发送复合击键。我的意思是发送类似 Ctrl+Tab 的内容。我尝试使用 KeyEventArgs,如下所示:

KeyEventArgs args1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.LeftCtrl);
KeyEventArgs args2 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab);
args1.RoutedEvent = Keyboard.KeyDownEvent;
args2.RoutedEvent = Keyboard.KeyDownEvent;
InputManager.Current.ProcessInput(args1);
InputManager.Current.ProcessInput(args2);

但是,这不起作用。有谁知道我该怎么做?

最佳答案

你可以这样做...

        var modKey = ModifierKeys.Control;
        var device = new MYKeyboardDevice(InputManager.Current)
        {
            ModifierKeysImpl = modKey
        };
        var keyEventArgs = device.CreateKeyEventArgs(Key.Tab, modKey);

MYKeyboardDevice

 public sealed class MYKeyboardDevice : KeyboardDevice
    {
        private sealed class MYPresentationSource : PresentationSource
        {
            Visual _rootVisual;

            protected override CompositionTarget GetCompositionTargetCore()
            {
                throw new NotImplementedException();
            }

            public override bool IsDisposed
            {
                get { return false; }
            }

            public override Visual RootVisual
            {
                get { return _rootVisual; }
                set { _rootVisual = value; }
            }
        }

        private static RoutedEvent s_testEvent = EventManager.RegisterRoutedEvent(
                "Key Event",
                RoutingStrategy.Bubble,
                typeof(MYKeyboardDevice),
                typeof(MYKeyboardDevice));

        public ModifierKeys ModifierKeysImpl;

        public MYKeyboardDevice()
            : this(InputManager.Current)
        {

        }

        public MYKeyboardDevice(InputManager manager)
            : base(manager)
        {

        }

        protected override KeyStates GetKeyStatesFromSystem(Key key)
        {
            var hasMod = false;
            switch (key)
            {
                case Key.LeftAlt:
                case Key.RightAlt:
                    hasMod = HasModifierKey(ModifierKeys.Alt);
                    break;
                case Key.LeftCtrl:
                case Key.RightCtrl:
                    hasMod = HasModifierKey(ModifierKeys.Control);
                    break;
                case Key.LeftShift:
                case Key.RightShift:
                    hasMod = HasModifierKey(ModifierKeys.Shift);
                    break;
            }

            return hasMod ? KeyStates.Down : KeyStates.None;
        }

        public KeyEventArgs CreateKeyEventArgs(
            Key key,
            ModifierKeys modKeys = ModifierKeys.None)
        {
            var arg = new KeyEventArgs(
                this,
                new MYPresentationSource(),
                0,
                key);
            ModifierKeysImpl = modKeys;
            arg.RoutedEvent = s_testEvent;
            return arg;
        }

        private bool RaiseEvents(UIElement target, RoutedEventArgs e, params RoutedEvent[] routedEventArray)
        {
            foreach (var routedEvent in routedEventArray)
            {
                e.RoutedEvent = routedEvent;
                target.RaiseEvent(e);
                if (e.Handled)
                {
                    return true;
                }
            }

            return false;
        }

        private bool HasModifierKey(ModifierKeys modKey)
        {
            return 0 != (ModifierKeysImpl & modKey);
        }
    }

关于c# - 如何从代码隐藏发送多个击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899329/

相关文章:

c# - 难以理解 Margin 属性

c# - 在当前用户控件中单击按钮时显示不同的用户控件

WPF ValueConverter 绑定(bind) - 出了点问题

WPF 和 MVVM : How to Refresh controls

c# - ASP.NET 高效聊天应用程序方法

c# - 是否可以在不制作副本的情况下将 C# double[,,] 数组转换为 double[]

c# - 在处理 HTTP 客户端时如何知道何时关闭套接字?

c# - 在 C# Windows 应用程序中进行 map 编程

wpf - 如何防止选项卡导航到控件,同时允许定向导航到该控件

基于文本长度的 WPF 文本框背景颜色