2017-02-22 8 views
2

Когда я пытаюсь отправить текст из моего RichTextBox в Notepad ++, он отправляет только первую букву текста. Поэтому, если бы у меня в текстовом поле Send this to Notepad++ в Notepad ++ все, что появилось, будет S.SendMessage to Notepad ++ in C#

Вот мой код

[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
    [DllImport("User32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 
    private void button2_Click(object sender, EventArgs e) 
    { 

     Process[] notepads = Process.GetProcessesByName("notepad++"); 
     if (notepads.Length == 0) return; 
     if (notepads[0] != null) 
     { 
      IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Scintilla", null); 
      SendMessage(child, 0x000C, 0, RichTextBox1.Text); 
     } 
    } 
+0

CharSet = CharSet.Unicode. Стандартный совет: используйте автоматизацию пользовательского интерфейса, чтобы избежать неправильной информации. Пространство имен System.Windows.Automation. –

ответ

4

Вы работаете в вопросе строки кодирования. Строками в .NET являются строки юнита UTF-16. Строка "Send" в UTF-16 на самом деле является байтами S{0}e{0}n{0}d{0}{0}{0}. В вашем объявлении SendMessage используется строковый метод ANSI. Существует несколько способов решить эту проблему. Вот один: Явно использую форму UTF-16, изменив SendMessage на SendMessageW.

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

Просто попробовал, работает как шарм! – Ehouarn

+0

Отлично. Существует также ряд других опций, использующих некоторые атрибуты атрибута «DllImport» и «MarshalAs» (по параметру). Но это самый краткий. Не забудьте отметить мой ответ, как принято. :) –

+0

Я хотел бы отметить ваш ответ как принято, но, к сожалению, я не тот, кто разместил вопрос: p – Ehouarn