程序无法识别多个进程

时间:2015-04-13 10:58:35

标签: c#

我编写了一个简单的C#控制台应用程序来将文本写入记事本进程。我从 SO 开始编写了这个过程,但是我想把它带到下一步,让它更有用。

delegate void WriteText(Process[] notepads, bool WriteAll, int index);

    [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("User32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
    static void Main(params string[] args)
    {
        if (args.Length != 0)
        {
            if (args != null)
            {
                string fullStr = "";
                foreach (string str in args)
                {
                    fullStr += str + " ";
                }
                int index = 0;
                WriteToNotepad(fullStr, ref index);
                Thread.Sleep(500);
                Console.WriteLine(string.Format("Wrote ' {0} ' to notepad[ {1} ] !", fullStr, index));

                Console.ReadLine();
            }
        }
    }

    static void WriteToNotepad(string text, ref int chosenNotepad)
    {
        WriteText write = (Process[] notepads, bool WriteAll, int index) =>
            {
                if (!WriteAll)
                {
                    if (notepads.Length == 0) return;
                    if (notepads[index] != null)
                    {
                        IntPtr child = FindWindowEx(notepads[index].MainWindowHandle, new IntPtr(0), "Edit", null);
                        SendMessage(child, 0x000c, 0, text);
                    }
                }
                else
                {
                    for (int notepadIndex = 0; notepadIndex < notepads.Length; notepadIndex++)
                    {
                        IntPtr child = FindWindowEx(notepads[notepadIndex].MainWindowHandle, new IntPtr(0), "Edit", null);
                        SendMessage(child, 0x000c, 0, text);
                    }
                }
            };

        Process[] notes = Process.GetProcessesByName("notepad");

        if (notes.Length < 1)
        {
            for (int i = 0; i < notes.Length; i++)
            {
                Console.WriteLine(string.Format("{0}: {1}", i, notes[i].Id));
            }
            Console.WriteLine("\nPick a number to select which notepad to edit.\nEnter 'ALL' to modify memory of every notepad process active:  ");
            string answer = Console.ReadLine();
            if (answer == "ALL")
            {
                write(notes, true, 0);
            }
            else
            {
                try
                {
                    int ans = Convert.ToInt32(answer);
                    chosenNotepad = ans;
                    write(notes, false, Convert.ToInt32(ans));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("\n\n\n" + ex.Message);
                }
            }
        }
    }

问题:如果您查看代码,您会看到我收集文字以便从static void Main(params string[] args)写信,所以我有类似的论点这个。 Debug settings

它会正确地将文字写入记事本! :)除了它不应该工作的方式......

如果您查看函数WriteToNotepad(),它会将名称为记事本的所有流程保存到变量名称notes

我有3个记事本全开,这意味着notes 长度应该是3,如果是,它将打印所有记事本索引&amp;名称和用户可以选择修改哪一个,如果用户输入&#39;全部&#39;程序将修改每个记事本进程。问题是,它直接修改了第一个记事本过程。 cmd result

我无法在这里找到问题,任何帮助都将不胜感激! :)

1 个答案:

答案 0 :(得分:3)

您的if (notes.Length < 1)会在不执行任何操作的情况下返回该方法,将ref int chosenNotepad保留为其默认值0,然后打印谎言。

将其更改为if (notes.Any())

您可以通过放置断点并单步执行代码来找到它。