Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#/Win32将文本写入记事本_C#_Winapi_Sendmessage - Fatal编程技术网

使用C#/Win32将文本写入记事本

使用C#/Win32将文本写入记事本,c#,winapi,sendmessage,C#,Winapi,Sendmessage,我在玩Win32 API和windows消息传递,试图弄清楚事情是如何工作的,我发现了这一点 我想改进那里提供的解决方案,这样它就可以附加文本,而不是仅仅通过WM_SETTEXT替换记事本中的文本 我的问题是,如何使用WM_getTextLength,后跟WM_GETTEXT,在记事本窗口中获取当前文本,以便在使用WM_SETTEXT之前向其添加新文本 使用WM_XXXTEXT在32位和64位机器上都有效吗?如果记事本中有大量文本,建议的get/set算法是否仍然有效,还是占用大量资源?如果是这

我在玩Win32 API和windows消息传递,试图弄清楚事情是如何工作的,我发现了这一点

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

我的问题是,如何使用WM_getTextLength,后跟WM_GETTEXT,在记事本窗口中获取当前文本,以便在使用WM_SETTEXT之前向其添加新文本

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

谢谢你的帮助

更新:

下面是我根据David Heffernan的帮助和Google/SO cut n pasting提出的代码。因为我是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);
            }

        } 

发送
EM_setel
将插入符号置于编辑窗口的末尾。然后发送
EM_REPLACESEL
以追加文本

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


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

EM_SETSEL和/或EM_REPLACESEL是否需要窗口焦点?它似乎不需要焦点,我将根据您的解决方案使用代码更新我的问题。谢谢你的帮助!