Русские символы в C# SetWindowTextW - PullRequest
1 голос
/ 01 февраля 2020

Я в основном использую это:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool SetWindowTextW(IntPtr hWnd, string lpString);

SetWindowTextW(HWnd, "лфорфпылвоарпфлыьтвмлафывафыва")

, чтобы установить заголовок окна, но заголовок заканчивается как:

ð╗Ðäð¥ÐÇÐäð┐Ðïð╗ð▓ð¥ð░ÐÇð┐Ðäð╗ÐïÐîÐéð▓ð╝ð╗ð░ÐäÐïð▓ð░ÐäÐïð▓ð░

I думаю, что это связано с неправильной кодировкой. Интересно, что это работает, если я набираю строку в TextBox и отправляю свойство textbox.Text той же функции.

Я получаю похожую строку из API, поэтому просто набрать ее и сохранить результат не возможно.

(я знаю, что текст в приведенном выше коде - просто случайные символы, но в результате получается похожий беспорядок с реальными словами)

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы можете напрямую использовать SendMessage для отправки WM_SETTEXT сообщения в чужое Окно:

Из раздела «Примечания» SetWindowText :

Если целевое окно принадлежит текущему процессу, SetWindowText вызывает отправку сообщения WM_SETTEXT в указанное окно или элемент управления. Однако, если элемент управления является элементом списка, созданным в стиле WS_CAPTION, SetWindowText устанавливает текст для элемента управления, а не для записей списка.

Чтобы задать текст элемента управления в другом процессе, отправьте Сообщение WM_SETTEXT напрямую вместо вызова SetWindowText.

Charset = CharSet.Auto используется для правильного маршалинга строки. Целевые требования к операционной системе определяются автоматически (C# пометит его как ANSI в противном случае).
См. Также: Кодировки и маршалинг .


[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);

const uint WM_SETTEXT = 0X000C;

IntPtr hWnd = [TheWindowHandle];
IntPtr russianPtr = Marshal.StringToHGlobalUni("лфорфпылвоарпфлыьтвмлафывафыва");
SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, russianPtr);
Marshal.FreeHGlobal(russianPtr);
0 голосов
/ 01 февраля 2020

Попробуйте, с L для буквального префикса.

SetWindowTextW(HWnd, L"лфорфпылвоарпфлыьтвмлафывафыва")
...