获取未命名的记事本内容

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 方法可以使用。