Ошибка: невозможно преобразовать символ в wchat_t *

Я пытаюсь получить заголовок активного окна, используя функции GetForegroundWindow и GetWindowText, и это мой код

HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);

И каждый раз, когда я пытаюсь построить проект, я получаю это сообщение об ошибке «Ошибка: Ошибка: невозможно преобразовать символ в wchat_t *»

Я использую C ++ Builder XE7

Итак, что не так?

0

Решение

Вы создаете свое приложение в режиме с поддержкой Юникода; char недостаточно велик, чтобы содержать символ UTF-16. Система типов спасает вас от много потенциальной головной боли здесь, поймав это для вас. Либо переключитесь в режим ASCII (простое, но плохое решение), либо переключитесь на использование широких строк везде (раздражающее решение), либо используйте предоставленные макросы для выбора во время компиляции на основе параметров сборки (еще более раздражающее, но наиболее правильное решение).

Вот как будет выглядеть этот фрагмент кода с любым из приведенных выше решений:

HWND hwnd = GetForegroundWindow();
wchar_t wname[255];
GetWindowText(hwnd, wname, 255);

HWND hwnd = GetForegroundWindow();
TCHAR wname[255];
GetWindowTextW(hwnd, wname, 255);

Если вы решили создать приложение, поддерживающее Unicode (что вам следует), вы также должны помнить об использовании wmain или же _tmain в зависимости от обстоятельств, а не просто старый скучный main, Потому что винда.

0

Другие решения

Вы звоните TCHAR версия GetWindowText(), В опциях вашего проекта у вас есть «TCHAR карты для» опция установлена ​​в wchar_t, так GetWindowText() карты для GetWindowTextW(), который занимает wchar_t* параметр. Вот почему вы не можете пройти в char[] буфер.

Итак, вам нужно либо:

  1. + Изменить «TCHAR карты для» в char чтобы GetWindowText() карты для GetWindowTextA() вместо этого (также аналогично влияет на все остальные TCHARвызов API-функции в вашем коде. Используйте этот подход только при переносе устаревшего кода, предшествующего Юникоду, в C ++ Builder 2009+).

  2. Измените свой код для использования TCHAR вместо:

    TCHAR wname[255];
    GetWindowText(hwnd,wname,255);
    
  3. Измените код, чтобы использовать версию Ansi или Unicode GetWindowText() непосредственно:

    char wname[255];
    GetWindowTextA(hwnd,wname,255);
    

    wchar_t wname[255];
    GetWindowTextW(hwnd,wname,255);
    
3