Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取无标题记事本内容_C#_Windows_Notepad - Fatal编程技术网

C# 获取无标题记事本内容

C# 获取无标题记事本内容,c#,windows,notepad,C#,Windows,Notepad,我正在寻找一个c语言或任何语言的解决方案,该解决方案将实现以下功能: 假设你有一个打开的记事本,里面写着什么。文件未保存 2通过该程序,您将创建另存为foo.txt的记事本文件,然后将其关闭 在C中,您可以通过名称或id获取进程,这样您就可以拥有进程。但是,如何使进程另存为,然后关闭?或者至少可以得到记事本的数据,然后我可以通过SystemIO保存它。 但问题是如何从进程中获取进程的数据,在我的特定示例中获取记事本文本记住文本未保存,因此无法从路径中恢复它 非常感谢。您可以获得记事本++源代码,

我正在寻找一个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方法

你这么做的原因是什么?我真的很好奇你为什么要这么做,因为有很多打开的无标题记事本,想要立即保存和关闭。我怀疑记事本可能会以某种方式暴露这些信息,这可能不会,因为我无法想象作者曾经认为有人需要这样做。如果这是一个纯粹的学术练习,你可能想尝试完全其他的东西。如果这是对某些东西的实际需求,我怀疑这是由于之前的设计错误造成的,并且这种方法是有缺陷的。为什么不制作自己的文本编辑器呢?这样做很简单,效果很好!你是一个传奇!!!