我正在尝试从代码后面发送复合击键。我的意思是发送类似 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/