我编写了一个简单的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)
写信,所以我有类似的论点这个。
它会正确地将文字写入记事本! :)除了它不应该工作的方式......
如果您查看函数WriteToNotepad()
,它会将名称为记事本的所有流程保存到变量名称notes
。
我有3个记事本全开,这意味着notes
长度应该是3,如果是,它将打印所有记事本索引&amp;名称和用户可以选择修改哪一个,如果用户输入&#39;全部&#39;程序将修改每个记事本进程。问题是,它直接修改了第一个记事本过程。
我无法在这里找到问题,任何帮助都将不胜感激! :)
答案 0 :(得分:3)
您的if (notes.Length < 1)
会在不执行任何操作的情况下返回该方法,将ref int chosenNotepad
保留为其默认值0
,然后打印谎言。
将其更改为if (notes.Any())
。
您可以通过放置断点并单步执行代码来找到它。