c# - 将 key 发送到非事件应用程序

标签 c# winforms send sendkeys postmessage

我正在尝试弄清楚如何让我的 C# 应用程序将 key 发送到另一个应用程序窗口,而不用关注它。 我有一个单词列表和 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 个进程称为记事本。 但是,如果它们被命名为 Note1、Note2、Note3,我该怎么做呢?

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

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

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

谁能帮帮我?到目前为止还没有找到任何相关信息,相信我,我已经四处寻找了!

最佳答案

不幸的是,没有很好的方法来做到这一点。 SendKeys 是一个非常简单且令人满意的 API,但它仅适用于事件窗口。没有办法让它在非事件窗口上工作,也没有一个 API 具有与在非事件窗口上工作相同的访问便利性。

通常当人们遇到这个问题时,他们必须走两条路之一

  1. 物理激活您想要一次将 key 发送给一个应用
  2. 下降到更低级别的 SendMessagePostMessage 以发送键盘事件

第二个选项通常更可靠但更难实现。

关于c# - 将 key 发送到非事件应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21339502/

相关文章:

tcp - winsock2:如果套接字已死,则 send() 失败 [不是真的]

c# - 手动验证 ASP.NET 身份用户帐户

c++ - Visual Studio 2010 Professional for C++ Windows Form Application下更改启动窗体

c# - 使用 LINQ 对 DataTable 中的数据进行分组

c# - 在 KeyUp 事件中检测按键

c# - 如何从按钮触发 DropDownClosed 事件

package - 计算机如何知道将数据包发送到哪里,只有 ip 而不是 mac

ios - 应用程序被杀死时如何请求数据?

c# - 如何使用 ICU 扩展为 SQLIte 编写不区分大小写的 C# LIKE 语句?

c# - 如何在不同网络上创建和使用基于 DNS 的自签名证书