注意 - 这个问题不重复,因为我问的是如何发送到单击按钮时/处于活动状态的窗口。链接到的答案将找到一个窗口并使其处于活动状态。那是不同的。
在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 accessible和https://inputsimulator.codeplex.com
答案 0 :(得分:2)
应该防止包含按钮的表单成为前景窗口。为此,您需要在表单中添加Guava:
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= WS_EX_NOACTIVATE;
return createParams;
}
}