【问题标题】:Write text to notepad with C#/Win32使用 C#/Win32 将文本写入记事本
【发布时间】:2011-09-30 01:12:45
【问题描述】:

我正在搞乱 Win32 API 和 Windows 消息传递,试图弄清楚事情是如何工作的,我发现了这个 question very helpful。

我想改进那里提供的解决方案,以便它附加文本,而不是仅仅通过 WM_SETTEXT 替换记事本中的文本。

我的问题是,我将如何使用 WM_GETTEXTLENGHT,然后使用 WM_GETTEXT 来获取记事本窗口中的当前文本,以便在使用 WM_SETTEXT 之前将新文本附加到其中?

在 32 位和 64 位机器上都可以使用 WM_XXXTEXT 吗?如果记事本中有很多文本,建议的 get/set 算法是否仍然有效,还是会占用大量资源?如果是这样,是否有另一种方法可以将文本附加到记事本窗口而不先复制其中的所有内容?

谢谢你的帮助!!

更新:

这是我根据 David Heffernan 的帮助和 Google/SO 剪切 n 粘贴提出的代码。由于我是 Win32API 的新手,并且从不同来源复制了许多行,因此我将不胜感激任何和所有反馈。

[DllImport("User32.dll", CharSet = CharSet.Auto)]
        extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName);

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

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

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

        const int WM_GETTEXTLENGTH = 0x000E;

        const int EM_SETSEL = 0x00B1;

        const int EM_REPLACESEL = 0x00C2;

        public void testAppendText(string text)
        {
            Process[] notepads = Process.GetProcessesByName("notepad");
            if (notepads.Length == 0) return;
            if (notepads[0] != null)
            {
                IntPtr editBox = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
                int length = SendMessageGetTextLength(editBox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
                SendMessage(editBox, EM_SETSEL, length, length);
                SendMessage(editBox, EM_REPLACESEL, 1, text);
            }

        } 

【问题讨论】:

    标签: c# winapi sendmessage


    【解决方案1】:

    发送EM_SETSEL 将插入符号放在编辑窗口的末尾。然后发送EM_REPLACESEL 追加文本。

    如果编辑控件包含大量文本,这比读取整个内容、附加添加然后设置整个内容要好得多。

    这些方法可以毫无困难地跨越 32/64 位进程边界。

    【讨论】:

    • EM_SETSEL 和/或 EM_REPLACESEL 是否需要窗口焦点?
    • 它似乎不需要重点,我将根据您的解决方案使用我正在使用的代码更新我的问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多