【问题标题】:Enter a character in the active window of an external program在外部程序的活动窗口中输入一个字符
【发布时间】:2018-04-23 21:26:28
【问题描述】:

注意-这个问题不是重复的,因为我问的是如何发送到单击按钮时处于活动状态的窗口。链接到的答案将找到一个窗口并使其处于活动状态。那是不同的。

在 C# 中,使用 Winforms,当单击按钮时,如何将字符发送到活动窗口,例如记事本?

我有一个带有按钮的表单。手动打开记事本(不是从我的程序中)后,我想单击记事本窗口以激活它,然后单击我的按钮并让它在该活动窗口记事本中输入一个字符。

我可以使用原生 .NET 功能并做Sendkeys.Send("A")

或者我可以使用可通过 NuGet [1] 安装的 InputSimulator 包来完成这两行

WindowsInput.InputSimulator s = new WindowsInput.InputSimulator();
s.Keyboard.TextEntry("A");

无论哪种方式,他们都不会将字符放入记事本中。这可能部分是因为按钮获得焦点。

我可以做一个这里提到的解决方案,让按钮不聚焦(尽管它不会阻止我的程序窗口聚焦)

How to create a Button that can send keys to a conrol without losing focus - Virtual Keyboard

static void SetSty(Control control, ControlStyles flags, bool value)
{
    Type type = control.GetType();
    BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
    MethodInfo method = type.GetMethod("SetStyle", bindingFlags);
    if (method != null)
    {
        object[] param = { flags, value };
        method.Invoke(control, param);
    }
}

我可以打电话

SetSty(button1, ControlStyles.Selectable, false);

使用该技术,我可以单击表单上的文本框,然后单击我的按钮可以将文本写入该文本框,而不会失去文本框的焦点。

但这不适用于外部记事本窗口

因此,如果启动记事本 (start..run..notepad),然后单击我程序中的按钮,它会将焦点从记事本上移开,并且不会在该活动记事本窗口中输入文本。

[1] Installed InputSimulator via NuGet, no members accessiblehttps://inputsimulator.codeplex.com

【问题讨论】:

  • @RandRandom 虽然我还没有测试/见过那个,但我认为它不是重复的,因为这个是专门针对单击按钮时处于活动状态的应用程序的。我想如果我可以在程序中检测到哪个窗口处于活动状态,然后将其与该方法结合起来,那么如果我的程序不可避免地需要关注,那它就可以工作了
  • @RandRandom 我会看看是否将您链接到的那个问题与这个stackoverflow.com/questions/115868/… 结合起来解决我的问题.. 会看到..
  • @RandRandom 这不是重复的。在顶部查看我的注释
  • @RandRandom 正确答案,这是唯一的答案和被接受的答案,进一步显示了这不是重复的.. 请注意答案如何不是您认为这是重复的问题的答案的。

标签: c# .net winforms inputsimulator


【解决方案1】:

应防止包含按钮的窗体成为前台窗口。为此,您需要在表单中添加 WS_EX_NOACTIVATE

private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= WS_EX_NOACTIVATE;
        return createParams;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多