C# 获取无标题记事本内容
我正在寻找一个c语言或任何语言的解决方案,该解决方案将实现以下功能: 假设你有一个打开的记事本,里面写着什么。文件未保存 2通过该程序,您将创建另存为foo.txt的记事本文件,然后将其关闭 在C中,您可以通过名称或id获取进程,这样您就可以拥有进程。但是,如何使进程另存为,然后关闭?或者至少可以得到记事本的数据,然后我可以通过SystemIO保存它。 但问题是如何从进程中获取进程的数据,在我的特定示例中获取记事本文本记住文本未保存,因此无法从路径中恢复它C# 获取无标题记事本内容,c#,windows,notepad,C#,Windows,Notepad,我正在寻找一个c语言或任何语言的解决方案,该解决方案将实现以下功能: 假设你有一个打开的记事本,里面写着什么。文件未保存 2通过该程序,您将创建另存为foo.txt的记事本文件,然后将其关闭 在C中,您可以通过名称或id获取进程,这样您就可以拥有进程。但是,如何使进程另存为,然后关闭?或者至少可以得到记事本的数据,然后我可以通过SystemIO保存它。 但问题是如何从进程中获取进程的数据,在我的特定示例中获取记事本文本记住文本未保存,因此无法从路径中恢复它 非常感谢。您可以获得记事本++源代码,
非常感谢。您可以获得记事本++源代码,只需编写一个插件即可。虽然记事本++是用C++编写的,但是你仍然可以使用VisualStudio.< 如果不对标准windows记事本进行黑客攻击或访问其源代码,您将无法使用该记事本执行您想要的操作 记事本++的github: 或者至少可以得到记事本上的数据 正如其他人所说,这不是目前为止最好的方法 …但你确实可以做到 下面的示例检索所有打开的记事本实例的内容,并在控制台中将其吐出:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private const int WM_GETTEXT = 0xd;
private const int WM_GETTEXTLENGTH = 0xe;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, StringBuilder lParam);
private void button1_Click(System.Object sender, System.EventArgs e)
{
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("notepad");
foreach(System.Diagnostics.Process p in ps)
{
IntPtr editWnd = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Edit", "");
string sTemp = GetText(editWnd);
Console.WriteLine(p.MainWindowTitle);
Console.WriteLine("------------------------------");
Console.WriteLine(sTemp);
Console.WriteLine("------------------------------");
Console.WriteLine("");
}
}
private string GetText(IntPtr hWnd)
{
int textLength = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
System.Text.StringBuilder sb = new System.Text.StringBuilder(textLength);
if (textLength > 0)
{
SendMessage(hWnd, WM_GETTEXT, textLength, sb);
}
return sb.ToString();
}
}
这种方法是特定于记事本的,它不是任何应用程序的通用方法。我们使用FindWindowEx查找名为Edit的子窗口,它是主应用程序窗口的直接子窗口。您可以使用Spy++等工具来确定应用程序的窗口层次结构,以帮助解决此类问题。在目标窗口埋得更深的情况下,或者可能是某一特定级别上许多相同类型的窗口中的一个,您可能需要使用其他几个API来获得正确窗口的句柄。这是一个复杂的主题,可以使用其他几种低级API方法 你这么做的原因是什么?我真的很好奇你为什么要这么做,因为有很多打开的无标题记事本,想要立即保存和关闭。我怀疑记事本可能会以某种方式暴露这些信息,这可能不会,因为我无法想象作者曾经认为有人需要这样做。如果这是一个纯粹的学术练习,你可能想尝试完全其他的东西。如果这是对某些东西的实际需求,我怀疑这是由于之前的设计错误造成的,并且这种方法是有缺陷的。为什么不制作自己的文本编辑器呢?这样做很简单,效果很好!你是一个传奇!!!