【问题标题】:SendKeys to multiple of the same process向多个相同进程发送密钥
【发布时间】:2017-10-01 21:28:35
【问题描述】:

我希望我的程序能够使用“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);

到目前为止,应用程序能够找到记事本并发送密钥,但它只会一遍又一遍地将其发送到 ONE 进程(相同的进程)。我尝试创建一个 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
  • @Proxy 我曾尝试对进程 [0] 使用 foreach 循环,但我不能在那里有一个 int,因为它是一个进程。

标签: c# process console console-application sendkeys


【解决方案1】:

虽然我没有其他代码来测试它,但如果你只是用 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 您不需要指定索引,因为它会“自动”检查存储在数组中的每个对象。有关 for vs foreach 的更多详细信息 Difference between foreach and for loops over an IEnumerable class in C#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 2020-12-31
    • 1970-01-01
    • 2021-02-06
    • 2014-02-15
    • 2013-12-27
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多