在外部程序的活动 window 中输入一个字符
Enter a character in the active window of an external program
注意 - 这个问题不是重复的,因为我问的是如何发送到 window,was/is 在单击按钮时处于活动状态。链接到的答案将找到 window 并将其激活。那是不一样的。
在 C# 中,使用 Winforms,如何在单击按钮时将字符发送到活动 window 例如记事本?
我有一个带有按钮的表单。手动打开记事本(不是从我的程序),我想点击记事本 window 来激活它,然后点击我的按钮并让它在活动的 window、记事本中输入一个字符。
我可以使用本机 .NET 功能并执行 Sendkeys.Send("A")
或者我可以使用可通过 NuGet 安装的 InputSimulator 包完成这两行 [1]
WindowsInput.InputSimulator s = new WindowsInput.InputSimulator();
s.Keyboard.TextEntry("A");
不管怎样,他们不会把字符放到记事本里。这可能部分是因为按钮获得了焦点。
我可以做这里提到的解决方案,让按钮不聚焦(虽然它不会阻止我的程序 window 聚焦)
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);
使用该技术,我可以单击表单上的文本框,然后单击我的按钮可以将文本写入该文本框,而不会失去文本框的焦点。
但这不适用于外部记事本window
因此,如果启动记事本 (start..运行..notepad),然后单击我程序中的按钮,它会将焦点从记事本上移开,并且不会在该活动记事本中输入文本 window.
[1] Installed InputSimulator via NuGet, no members accessible and https://inputsimulator.codeplex.com
应防止包含按钮的表单出现在前台window。为此,您需要在表单中添加 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;
}
}
注意 - 这个问题不是重复的,因为我问的是如何发送到 window,was/is 在单击按钮时处于活动状态。链接到的答案将找到 window 并将其激活。那是不一样的。
在 C# 中,使用 Winforms,如何在单击按钮时将字符发送到活动 window 例如记事本?
我有一个带有按钮的表单。手动打开记事本(不是从我的程序),我想点击记事本 window 来激活它,然后点击我的按钮并让它在活动的 window、记事本中输入一个字符。
我可以使用本机 .NET 功能并执行 Sendkeys.Send("A")
或者我可以使用可通过 NuGet 安装的 InputSimulator 包完成这两行 [1]
WindowsInput.InputSimulator s = new WindowsInput.InputSimulator();
s.Keyboard.TextEntry("A");
不管怎样,他们不会把字符放到记事本里。这可能部分是因为按钮获得了焦点。
我可以做这里提到的解决方案,让按钮不聚焦(虽然它不会阻止我的程序 window 聚焦)
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);
使用该技术,我可以单击表单上的文本框,然后单击我的按钮可以将文本写入该文本框,而不会失去文本框的焦点。
但这不适用于外部记事本window
因此,如果启动记事本 (start..运行..notepad),然后单击我程序中的按钮,它会将焦点从记事本上移开,并且不会在该活动记事本中输入文本 window.
[1] Installed InputSimulator via NuGet, no members accessible and https://inputsimulator.codeplex.com
应防止包含按钮的表单出现在前台window。为此,您需要在表单中添加 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;
}
}