C# 向非活动应用程序发送密钥

C# 向非活动应用程序发送密钥,c#,winforms,send,sendkeys,postmessage,C#,Winforms,Send,Sendkeys,Postmessage,我正试图弄明白如何让我的C#应用程序将密钥发送到另一个应用程序窗口,而不用关注它。 我有一个单词列表和3个记事本文件。 假设我按顺序打开了所有3个记事本窗口,我的程序将获取列表框中的第一个单词并将其写入第一个记事本窗口。第二个记事本窗口中的第二个单词和第三个记事本窗口中的第三个单词。然后重新开始并继续。 所以我想让它在每个帖子里贴上一个单词,然后一遍又一遍地这样继续 但我只知道如何使用一个记事本窗口(当它处于活动状态时) 这将需要我首先关注记事本窗口,启动计时器,然后保持对记事本窗口的关注。然后

我正试图弄明白如何让我的C#应用程序将密钥发送到另一个应用程序窗口,而不用关注它。 我有一个单词列表和3个记事本文件。 假设我按顺序打开了所有3个记事本窗口,我的程序将获取列表框中的第一个单词并将其写入第一个记事本窗口。第二个记事本窗口中的第二个单词和第三个记事本窗口中的第三个单词。然后重新开始并继续。 所以我想让它在每个帖子里贴上一个单词,然后一遍又一遍地这样继续

但我只知道如何使用一个记事本窗口(当它处于活动状态时)

这将需要我首先关注记事本窗口,启动计时器,然后保持对记事本窗口的关注。然后它只需在列表中循环并键入单词(每行1个)。而且效果很好。但我希望能在3个窗口上完成

然后我需要以某种方式获取窗口标题,而不是进程名称。 我将有3个进程称为记事本。 但是如果它们被命名为Note1,Note2,Note3,我该怎么做呢

我需要帮助来列出要写入的程序:

listofprograms = ["Note1", "Note2", "Note3"];
它会发现用这些名称打开的应用程序窗口, 然后把文字写进那些窗口


有人能帮我吗?到目前为止还没有找到任何关于这个的东西,相信我,我已经到处找过了

不幸的是,没有什么好办法可以做到这一点
SendKeys
是一个非常简单和理想的API,但它只适用于活动窗口。没有办法让它在非活动窗口上工作,也没有一个API可以像在非活动窗口上一样易于访问

一般来说,当人们遇到这个问题时,他们必须走两条路线中的一条

  • 物理激活您希望一次向一个应用发送密钥的应用
  • 下拉到更低级别的
    SendMessage
    PostMessage
    发送键盘事件

  • 第二种选择通常更可靠,但更难实施

    SendKeys
    不是为这种类型的功能而设计的。要完成所需操作,需要在代码中使用一些Win32 API调用。请参阅以获取参考。

    如果您正在寻找使用SendKeys向应用程序发送密钥的方法。发送(密钥)是一个选项,但您需要通过SetForegroundWindow API将窗口置于顶部

    因此,如果您继续使用您的方法,您可以使用FindWindow、setforegroundindow来强制激活和聚焦记事本窗口,以便发送按键

    [DllImportAttribute("User32.dll")]
    private static extern int FindWindow(String ClassName, String WindowName);
    
    [DllImport("user32.dll")]
    private static extern IntPtr SetForegroundWindow(int hWnd);
    
    public int Activate(int hWnd)
    {
       if (hWnd > 0) {
          SetForegroundWindow(hWnd);
          return hWnd;
       }
       else {
           return -1;
       }
    }
    
    public int GetWindowHwnd(string className, string windowName) {
         int hwnd = 0;
         string cls = className == string.Empty  ? null : className;
         string win = windowName == string.Empty ? null : windowName;
    
         hwnd = FindWindow(cls , win );
         return hwnd;
    }
    
    尽管还有另一个解决方案,可以帮助您解决问题。此处处理所有记事本进程:

    通过一些调整,它也应该适用于您的情况(基本上,您将迭代和循环找到的记事本实例,并在每个实例中放置一个单词)

    您可能还想查看有关FindWindow的以下信息:

    设置键盘状态

    以及发送消息:


    您应该在示例和说明中找到一些有用的提示。

    假设在1中您指的是激活,这可能有助于OP I不想将焦点放在任何记事本窗口上。这很容易做到,但关键是我希望能够将列表框中的文本直接发送到这些窗口中。它们可以被最小化或者其他什么。没有简单的方法可以做到这一点吗?@user3036459不,在这种情况下,您几乎必须求助于
    sendmages
    PostMessage
    来发送密钥
    [DllImportAttribute("User32.dll")]
    private static extern int FindWindow(String ClassName, String WindowName);
    
    [DllImport("user32.dll")]
    private static extern IntPtr SetForegroundWindow(int hWnd);
    
    public int Activate(int hWnd)
    {
       if (hWnd > 0) {
          SetForegroundWindow(hWnd);
          return hWnd;
       }
       else {
           return -1;
       }
    }
    
    public int GetWindowHwnd(string className, string windowName) {
         int hwnd = 0;
         string cls = className == string.Empty  ? null : className;
         string win = windowName == string.Empty ? null : windowName;
    
         hwnd = FindWindow(cls , win );
         return hwnd;
    }