C# 在外部程序的活动窗口中输入字符

C# 在外部程序的活动窗口中输入字符,c#,.net,winforms,inputsimulator,C#,.net,Winforms,Inputsimulator,注意-这个问题不是重复的,因为我问的是如何发送到单击按钮时处于活动状态的窗口。链接到的答案将找到一个窗口并将其激活。那不一样。 在C#中,使用Winforms,当单击按钮时,如何将字符发送到活动窗口(如记事本) 我有一张有按钮的表格。手动打开记事本后(不是从我的程序),我想单击记事本窗口激活它,然后单击我的按钮,让它在活动窗口记事本中输入一个字符 我可以使用本机.NET功能并执行Sendkeys.Send(“A”) 或者我可以使用可通过NuGet安装的InputSimulator包来完成这两行代

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

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

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

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

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

WindowsInput.InputSimulator s = new WindowsInput.InputSimulator();
s.Keyboard.TextEntry("A");
不管怎样,他们都不会把字符放进记事本。这可能部分是因为按钮可以聚焦

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

我可以打电话

SetSty(button1, ControlStyles.Selectable, false);
通过这种技术,我可以点击表单上的文本框,然后点击我的按钮可以将文本写入该文本框,而不会失去文本框的焦点

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

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


[1] 和

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

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

@RandRandom的可能重复虽然我还没有测试/看到它,但我不认为它是重复的,因为这是专门针对在单击按钮时处于活动状态的应用程序的。我想如果我能在程序启动时检测到哪个窗口处于活动状态,然后将其与该方法相结合,那么如果我的程序能够聚焦,那么它就可以工作了inevitable@RandRandom我会看看把你链接的问题和这个问题结合起来是否能解决我的问题。。将看到..@RandRandom这不是重复的。请看我的便条top@RandRandom正确答案是唯一的答案,也是公认的答案,这进一步说明了这不是重复的答案。。请注意,答案不是您认为这是一个重复的问题的答案。
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= WS_EX_NOACTIVATE;
        return createParams;
    }
}