С# Получение заголовка окна по дескриптору на иврите возвращает вопросительные знаки

Я использую это: чтобы получить заголовок окна по его дескриптору:

[DllImport("user32.dll")] private static extern int GetWindowText(int hWnd, StringBuilder title, int size);

StringBuilder title = new StringBuilder(256);
GetWindowText(hWnd, title, 256);

Если в заголовке есть ивритские символы, они заменяются вопросительными знаками.
Я думаю, проблема связана с преобразованием или чем-то еще... как я могу ее решить?


person Ron    schedule 02.10.2013    source источник
comment
Какая версия Windows?   -  person Alireza    schedule 02.10.2013
comment
Windows 8 Pro 64 бит, не имеет значения - работает одинаково во всех версиях (я полагаю, если я тестировал в своих окнах и Windows XP)   -  person Ron    schedule 02.10.2013


Ответы (2)


Использовать этот:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetWindowText(int hWnd, StringBuilder title, int size);
person Hamlet Hakobyan    schedule 02.10.2013
comment
Черт, это было быстро и довольно легко. Спасибо! :D - person Ron; 02.10.2013

Ваш вопрос содержит небольшую ошибку, которая может встречаться не очень часто. Вы предполагаете, что заголовок имеет максимальную длину 256 символов, что может быть достаточно для большинства случаев. Но как это сообщение показывает, что длина может составлять 100 000 символов, а то и больше. Поэтому я бы использовал другую вспомогательную функцию: GetWindowTextLength.

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);

public static string GetWindowTitle(IntPtr hWnd)
{
    var length = GetWindowTextLength(hWnd) + 1;
    var title = new StringBuilder(length);
    GetWindowText(hWnd, title, length);
    return title.ToString();
}
person 0xBADF00D    schedule 06.09.2019
comment
Для меня длина всегда равна (реальная длина -1). Не знаю почему, но простой var length = GetWindowTextLength(hwnd) + 1; решает мою проблему. - person Alex Wyler; 25.05.2020
comment
@alexWyler Я наткнулся на ту же проблему, но забыл обновить свой ответ. Я предполагаю, что GetWindowTitle возвращает длину без разделителя \0, который используется в C и C++ для обозначения конца строки. Но это только предположение - person 0xBADF00D; 12.03.2021