【问题标题】:WPF Equivalent to SendInput?WPF相当于SendInput?
【发布时间】:2012-11-12 03:35:42
【问题描述】:

WPF 是否有与 SendInput 等效的方法?我查看了AutomationPeer 课程,但没有成功。

我只是想发送一个 Keydown(回车键)。简单地引发事件 (RaiseEvent) 在我的场景中不起作用。

这是我所拥有的,它正在工作。我希望有一个托管代码替代方案。

    private void comboSelectionChanged(object sender, SelectionChangedEventArgs args)
    {
        ((ComboBox)sender).Focus();
        // send keydown
        INPUT input = new INPUT();
        input.type = INPUT_KEYBOARD;
        input.union.keyboardInput.wVk = 0x0D;
        input.union.keyboardInput.time = 0;
        SendInput(1, ref input, Marshal.SizeOf(input));
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int SendInput(int nInputs, ref INPUT mi, int cbSize);

    [StructLayout(LayoutKind.Sequential)]
    private struct INPUT
    {
        public int type;
        public INPUTUNION union;
    };

    [StructLayout(LayoutKind.Explicit)]
    private struct INPUTUNION
    {
        [FieldOffset(0)]
        public MOUSEINPUT mouseInput;
        [FieldOffset(0)]
        public KEYBDINPUT keyboardInput;
    };

    [StructLayout(LayoutKind.Sequential)]
    private struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public int mouseData;
        public int dwFlags;
        public int time;
        public IntPtr dwExtraInfo;
    };

    [StructLayout(LayoutKind.Sequential)]
    private struct KEYBDINPUT
    {
        public short wVk;
        public short wScan;
        public int dwFlags;
        public int time;
        public IntPtr dwExtraInfo;
    };

    private const int INPUT_MOUSE = 0;
    private const int INPUT_KEYBOARD = 1;

【问题讨论】:

  • @HighCore 我使用可编辑的组合框,当您从下拉列表中选择一个值时,文本被选中,我想清除它。
  • OMG.. 你想通过使用 SendKeys 来做到这一点?这是一个非常糟糕的方法.. 为什么不清除组合框文本属性?
  • 如果您使用 WPF,最好熟悉推荐的技术,例如 MVVMDataBinding。发送键盘信号来操作 UI 是一种非常糟糕的方法。
  • 我不想清除文本,只是文本选择,不能通过 MVVM/Databinding 执行此操作。组合框甚至不显示文本选择

标签: c# .net wpf keyboard automation


【解决方案1】:

您可以像这样模拟击键:

public void SendKey(UIElement sourceElement, Key keyToSend)
    {

        KeyEventArgs args = new KeyEventArgs(InputManager.Current.PrimaryKeyboardDevice, PresentationSource.FromVisual(sourceElement), 0, keyToSend);

        args.RoutedEvent = Keyboard.KeyDownEvent;
        InputManager.Current.ProcessInput(args);

    }

你可以这样称呼它:

SendKey(myComboBox, Key.Enter);

我想你可以把它放在static class 的某个地方,或者甚至用它制作一个extension method。但是,我认为在大多数情况下,有一种更优雅的方式来实现这一点。

我希望这会有所帮助。

【讨论】:

  • 谢谢,在您发布之前,我终于彻底改变了我的方法(编写了另一个自定义控件...),但我尝试了这个并且它也有效。
  • 如何发送组合键,如 Ctrl+F?
  • 不幸的是,这不会导致 TextBox 更改其文本属性。是否有可能模拟 KeyDownEvent,导致 TextBox 更新其文本?
猜你喜欢
  • 2010-10-25
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多