SendKeys 到多个相同的进程

SendKeys to multiple of the same process

我希望我的程序能够使用 "SendKeys.SendWait()",一次将密钥发送到多个相同的进程。例如,如果我打开了 x 个记事本进程,我希望它能够计算数量,然后将密钥一一发送到所有进程。该程序是用 C# 编写的控制台应用程序。

我目前拥有的代码:

Process[] processes = Process.GetProcessesByName("notepad");
                Process game1 = processes[0];
                do
                {
                    while (!Console.KeyAvailable)
                    {
                            IntPtr p = game1.MainWindowHandle;
                            SetForegroundWindow(p);
                            SendKeys.SendWait("{ESC}");
                            Thread.Sleep(1000);
                            SendKeys.SendWait("^{C}");
                            SendKeys.SendWait("{ENTER}");
                            SendKeys.SendWait("{ENTER}");
                            Thread.Sleep(100);
                            SendKeys.SendWait("{A}");                                   
                    }
                } while (Console.ReadKey(true).Key != ConsoleKey.NumPad1);

到目前为止,应用程序能够找到记事本并发送密钥,但它只会一遍又一遍地将其发送到一个进程(同一进程)。我已经尝试创建一个 for 循环,但我不确定我将如何计算或实现 for 循环,以便我能够将它发送到每个打开的 x 数量的记事本。

在下面的代码中,我能够让它在 2 个记事本进程之间发送,但这只是因为我告诉它有 2 个并打开了 2 个。

Process[] processes = Process.GetProcessesByName("notepad");
            Process game1 = processes[0];
            do
            {
                while (!Console.KeyAvailable)
                {
                        game1 = processes[0];
                        IntPtr p = game1.MainWindowHandle;
                        SetForegroundWindow(p);
                        SendKeys.SendWait("{ESC}");
                        Thread.Sleep(1000);
                        SendKeys.SendWait("^{C}");
                        SendKeys.SendWait("{ENTER}");
                        SendKeys.SendWait("{ENTER}");
                        Thread.Sleep(100);
                        SendKeys.SendWait("{A}");

                        game1 = processes[1];
                        p = game1.MainWindowHandle;
                        SetForegroundWindow(p);
                        SendKeys.SendWait("{ESC}");
                        Thread.Sleep(1000);
                        SendKeys.SendWait("^{C}");
                        SendKeys.SendWait("{ENTER}");
                        SendKeys.SendWait("{ENTER}");
                        Thread.Sleep(100);
                        SendKeys.SendWait("{A}");
                }
            } while (Console.ReadKey(true).Key != ConsoleKey.NumPad1);

虽然我没有你的其余代码来测试它,但如果你只是用 for 循环更改你的 while 循环,应该可以工作

for (int i = 0; i < processes.Length; i++)
        {
            Process game1 = processes[i];
        }

抱歉,我无法编辑评论中的代码,但基本上您只需要从位置 0 的第一个元素开始遍历您的进程数组,并在通知 1 运行 进程后递增计数器

如果你想使用 foreach 循环,你需要这样做

 foreach (var temp in processes)
            {
                Process game1 = temp; // the assigment is not necessary you can just use the temp variable 
            }

基本上,对于 foreach,您不需要指定索引,因为它会 "automatically" 检查存储在数组中的每个对象。有关 for 与 foreach 的更多详细信息 Difference between foreach and for loops over an IEnumerable class in C#