如何从.net中打开记事本中的文本

本文关键字:记事本 文本 net | 更新日期: 2023-09-27 18:10:13

当我单击Windows窗体上的按钮时,我想打开一个记事本窗口,其中包含窗体上的文本框控件的文本。

我该怎么做呢?

如何从.net中打开记事本中的文本

您不需要使用此字符串创建文件。你可以使用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):

SetWindowText: pinvoke | msdn

findwindowwex: pinvoke | msdn

SendMessage: pinvoke | msdn

试一下:

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

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

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

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

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

非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字符的属性

我一直在使用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);
}