获取无标题的记事本内容

时间:2015-06-10 12:44:15

标签: c# windows notepad

我正在寻找c#中的解决方案,或者通常使用任何语言来解决这个问题:

1)假设你有一个打开的记事本,并在里面写了些东西。文件未保存。

2)通过该程序,您将创建另存为" foo.txt"记事本文件,然后关闭它。

在C#中,您可以按名称或ID获取进程,以便您可以拥有该进程。但那么如何使流程保存为然后关闭?或者至少可以获取记事本的数据,然后我可以通过SystemIO保存它。 但问题是如何从进程获取进程的数据并在我的特定示例中获取记事本文本(记住文本未保存,因此无法从路径中恢复它)。

非常感谢。

2 个答案:

答案 0 :(得分:1)

  

或者至少可以获取记事本的数据

正如其他人所说,到目前为止它并不是最好的方法......

......但是当然,你可以这样做。

这是一个示例,它检索所有打开的记事本实例的内容并在控制台中将它们吐出:

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方法。

答案 1 :(得分:0)

你可以获得notepad ++源代码,只需编写一个插件来做你想做的事。虽然notepad ++是用C ++编写的(你仍然可以使用visual studio)。

如果没有黑客攻击或获取其源代码,您将无法使用标准Windows记事本执行所需操作。

记事本++的github:

https://github.com/notepad-plus-plus/notepad-plus-plus