将KeyKeys发送到非活动应用程序

时间:2014-01-24 18:10:57

标签: c# winforms send sendkeys postmessage

我试图找出如何让我的C#应用​​程序将密钥发送到另一个应用程序窗口,而不关注它。 我有一个单词列表和3个笔记本文件。 想象一下,我按顺序打开了所有3个记事本窗口,我的程序将获取列表框中的第一个单词并将其写入第一个记事本窗口。第二个记事本窗口中的第二个字和第三个记事本窗口中的第三个字。然后重新开始并继续。 所以我希望它在每个中发布1个单词,并一遍又一遍地继续。

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

int i = 0;
i = listBox1.SelectedIndex;
i = i + 1;
if (i > listBox1.Items.Count - 1)
    i = 0;
listBox1.SelectedIndex = i;
string message = listBox1.SelectedItem.ToString();

SendKeys.Send(message);
SendKeys.Send("{ENTER}");

这需要我首先关注记事本窗口,启动计时器,然后将注意力集中在记事本窗口上。然后它将循环遍历列表并键入单词(每行1个)。它工作正常。但我希望能够在3个窗口上完成它。

然后我需要以某种方式得到窗口标题,而不是进程名称。 那么我会有3个名为Notepad的进程。 但如果它们被命名为Note1,Note2,Note3我该怎么做?

我需要帮助来制作一些要写入的程序列表:

listofprograms = ["Note1", "Note2", "Note3"];

它会发现应用程序窗口打开了这些名称, 然后以某种方式将文本写入那些窗口。

有人可以帮帮我吗?到目前为止还没有找到任何关于此的信息并相信我,我环顾四周!

3 个答案:

答案 0 :(得分:2)

不幸的是,没有很好的方法可以做到这一点。 SendKeys是一个非常简单且理想的API,但它仅适用于活动窗口。没有办法使它在非活动窗口上工作,也不存在具有在非活动窗口上工作的相同易用性的API。

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

  1. 将您想要一次发送密钥的应用实际激活
  2. 降低到SendMessagePostMessage的低级别以发送键盘事件
  3. 第二种选择通常更可靠但更难实施。

答案 1 :(得分:1)

SendKeys不适用于此类功能。要执行您要查找的内容,您需要在代码中使用一些Win32 API调用。请参阅How to send text to Notepad in C#/Win32?以供参考。

答案 2 :(得分:1)

如果您正在寻找将密钥发送到应用程序的方法,可以使用SendKeys.Send(keys)作为选项,但您需要通过SetForegroundWindow API将窗口置于顶部。

因此,如果继续使用您的方法,您可以使用FindWindow,SetForegroundWindow强制激活和聚焦记事本窗口,以便您可以发送密钥。

[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;
}

虽然还有另一种解决方案,可以帮助你。这里处理所有记事本过程:

How to send text to Notepad in C#/Win32?

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

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

http://www.pinvoke.net/default.aspx/user32.findwindow

<强> SetKeyboardState

http://www.pinvoke.net/default.aspx/user32/SetKeyboardState.html

以及 SendMessage

http://www.pinvoke.net/default.aspx/coredll/SendMessage.html

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