winforms 如何从.NET打开记事本中的文本?

nwlqm0z1  于 2023-01-02  发布在  .NET
关注(0)|答案(5)|浏览(140)

当我单击Windows Forms窗体上的按钮时,我希望打开一个记事本窗口,其中包含窗体上TextBox控件的文本。
我该怎么做呢?

h7appiyu

h7appiyu1#

你不需要用这个字符串创建文件。你可以用P/Invoke来解决你的问题。

NotepadHelper类的用法:

NotepadHelper.ShowMessage("My message...", "My Title");

NotepadHelper类代码:

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Notepad
{
    public static class NotepadHelper
    {
        [DllImport("user32.dll", EntryPoint = "SetWindowText")]
        private static extern int SetWindowText(IntPtr hWnd, string text);

        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

        public static void ShowMessage(string message = null, string title = null)
        {
            Process notepad = Process.Start(new ProcessStartInfo("notepad.exe"));
            if (notepad != null)
            {
                notepad.WaitForInputIdle();

                if (!string.IsNullOrEmpty(title))
                    SetWindowText(notepad.MainWindowHandle, title);

                if (!string.IsNullOrEmpty(message))
                {
                    IntPtr child = FindWindowEx(notepad.MainWindowHandle, new IntPtr(0), "Edit", null);
                    SendMessage(child, 0x000C, 0, message);
                }
            }
        }
    }
}
  • 参考资料(pinvoke.net和msdn.microsoft.com):*

设置窗口文本:pinvoke| msdn
查找窗口Ex:pinvoke| msdn
发送消息:pinvoke| msdn

6ss1mwsb

6ss1mwsb2#

试试这个:

System.IO.File.WriteAllText(@"C:\test.txt", textBox.Text);
System.Diagnostics.Process.Start(@"C:\test.txt");
v6ylcynt

v6ylcynt3#

使用File.WriteAllText将文件保存到磁盘:

File.WriteAllText("path to text file", myTextBox.Text);

然后使用Process.Start在记事本中打开它:

Process.Start("path to notepad.exe", "path to text file");
uplii1fm

uplii1fm4#

适用于非ASCII用户。

[DllImport("User32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Unicode)]
private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

基于**@Peter Mortensen的回答
CharSet = CharSet.Unicode**添加到属性中以支持Unicode字符

ekqde3dh

ekqde3dh5#

我一直在使用NotepadHelper解决方案,直到我发现它在Windows 11上不起作用。将文件写入磁盘并使用默认文本编辑器启动似乎是最好的解决方案。这已经发布,但我发现您需要传递UseShellExecute=true。

System.IO.File.WriteAllText(path, value);
System.Diagnostics.ProcessStartInfo psi = new() { FileName = path, UseShellExecute = true };
System.Diagnostics.Process.Start(psi);

我写入System.IO.Path.GetTempPath()文件夹,并在应用程序退出时运行一个清理程序--为应用程序使用的文件名搜索唯一的前缀模式。

string pattern = TempFilePrefix + "*.txt";
foreach (string f in Directory.EnumerateFiles(Path.GetTempPath(), pattern))
{
    File.Delete(f);
}

相关问题