获取未命名的记事本内容
Get untitled notepad contents
我正在寻找 c# 或一般任何语言的解决方案,它将执行以下操作:
1) 假设您有一个打开的记事本,并在里面写了一些东西。文件未保存。
2) 通过该程序,您将创建另存为 "foo.txt" 记事本文件,然后将其关闭。
在 C# 中,您可以通过名称或 ID 获取进程,这样您就可以拥有进程。但是如何让进程另存为然后关闭呢?或者至少获取记事本的数据,然后我可以通过 SystemIO 保存它。
但问题是如何从进程中获取进程的数据,在我的特定示例中获取记事本文本(记住文本未保存,因此无法从路径中恢复它)。
非常感谢。
你可以拿到notepad++的源代码,写个插件就可以获取文本了。虽然notepad++是用C++写的(你还是可以用visual studio)。
如果不破解或访问其源代码,您将无法使用标准 windows 记事本做您想做的事。
记事本++的github:
https://github.com/notepad-plus-plus/notepad-plus-plus
Or maybe at least get the data of notepad
正如其他人所说,这不是目前最好的方法...
...但是当然,您确实可以做到。
下面是一个示例,它检索所有打开的记事本实例的内容并将它们吐出到控制台中:
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" 的子 window,它是主应用程序 window 的直接子项。您可以使用 Spy++ 等工具找出应用程序的 window 层次结构,以帮助解决此类问题。在目标 window 埋得更深的情况下,或者可能是特定级别同一类型的许多 windows 之一,您可能需要使用其他几个 API 来获得正确 window 的句柄。这是一个复杂的主题,还有其他几种低级别 API 方法可以使用。
我正在寻找 c# 或一般任何语言的解决方案,它将执行以下操作:
1) 假设您有一个打开的记事本,并在里面写了一些东西。文件未保存。
2) 通过该程序,您将创建另存为 "foo.txt" 记事本文件,然后将其关闭。
在 C# 中,您可以通过名称或 ID 获取进程,这样您就可以拥有进程。但是如何让进程另存为然后关闭呢?或者至少获取记事本的数据,然后我可以通过 SystemIO 保存它。 但问题是如何从进程中获取进程的数据,在我的特定示例中获取记事本文本(记住文本未保存,因此无法从路径中恢复它)。
非常感谢。
你可以拿到notepad++的源代码,写个插件就可以获取文本了。虽然notepad++是用C++写的(你还是可以用visual studio)。
如果不破解或访问其源代码,您将无法使用标准 windows 记事本做您想做的事。
记事本++的github: https://github.com/notepad-plus-plus/notepad-plus-plus
Or maybe at least get the data of notepad
正如其他人所说,这不是目前最好的方法...
...但是当然,您确实可以做到。
下面是一个示例,它检索所有打开的记事本实例的内容并将它们吐出到控制台中:
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" 的子 window,它是主应用程序 window 的直接子项。您可以使用 Spy++ 等工具找出应用程序的 window 层次结构,以帮助解决此类问题。在目标 window 埋得更深的情况下,或者可能是特定级别同一类型的许多 windows 之一,您可能需要使用其他几个 API 来获得正确 window 的句柄。这是一个复杂的主题,还有其他几种低级别 API 方法可以使用。