注意-这个问题不是重复的,因为我在问如何发送到单击按钮时处于活动状态的窗口。链接到的答案将找到一个窗口并使其处于活动状态。那不一样。
在 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);
使用该技术,我可以单击表单上的文本框,然后单击我的按钮可以将文本写入该文本框,而不会失去文本框的焦点。
但这不适用于外部记事本窗口
因此,如果启动记事本(start..run..notepad),然后单击我程序中的按钮,它会将焦点从记事本上移开,并且不会在该活动的记事本窗口中输入文本。
[1]通过 NuGet 安装 InputSimulator,没有可访问的成员 和 https://inputsimulator.codeplex.com