Подтвердить что ты не робот

Запись текста в блокнот с помощью С#/Win32

Я возился с API Win32 и сообщениями Windows, пытаясь выяснить, как все работает, и я нашел этот вопрос очень полезным.

Я бы хотел улучшить предлагаемое решение, чтобы оно добавляло текст вместо того, чтобы просто заменять текст в блокноте через WM_SETTEXT.

Мой вопрос: как использовать WM_GETTEXTLENGHT, а затем WM_GETTEXT, чтобы получить текущий текст в окне блокнота, чтобы я мог добавить к нему новый текст перед использованием WM_SETTEXT?

Использует ли WM_XXXTEXT работу как на 32, так и на 64-битных машинах? Если в записной книжке много текста, предлагаемый алгоритм get/set все еще будет работать или он будет запугать кучу ресурсов? Если да, есть ли другой способ добавить текст в окно блокнота без копирования всего в нем?

Спасибо за помощь!

UPDATE:

Вот код, который я придумал, основываясь на помощи Дэвида Хеффернана и Google/SO cut 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);
            }

        } 
4b9b3361

Ответ 1

Отправьте EM_SETSEL, чтобы поместить каретку в конец окна редактирования. Затем отправьте EM_REPLACESEL, чтобы добавить текст.

Это намного лучше, чем чтение всего содержимого, добавление вашего дополнения, а затем установка всего содержимого, если элемент управления редактирования содержит большой объем текста.

Эти методы могут беспрепятственно пересекать границы процесса 32/64 бит.