在外部程序的活动窗口中输入一个字符



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

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

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

我可以使用本机.NET功能并执行Sendkeys.Send("A")

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

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

不管怎样,他们都不会在记事本上输入字符。这在一定程度上可能是因为按钮可以聚焦。

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

如何创建一个按钮,可以在不失去焦点的情况下将键发送到控制器-虚拟键盘

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);

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

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

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

[1] 通过NuGet安装InputSimulator,没有成员可访问https://inputsimulator.codeplex.com

应该防止包含按钮的窗体成为前台窗口。为此,您需要将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;
}
}

最新更新