Я пытаюсь получить заголовок активного окна, используя функции GetForegroundWindow и GetWindowText, и это мой код
HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);
И каждый раз, когда я пытаюсь построить проект, я получаю это сообщение об ошибке «Ошибка: Ошибка: невозможно преобразовать символ в wchat_t *»
Я использую C ++ Builder XE7
Итак, что не так?
Вы создаете свое приложение в режиме с поддержкой Юникода; 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
, Потому что винда.
Вы звоните TCHAR
версия GetWindowText()
, В опциях вашего проекта у вас есть «TCHAR карты для» опция установлена в wchar_t
, так GetWindowText()
карты для GetWindowTextW()
, который занимает wchar_t*
параметр. Вот почему вы не можете пройти в char[]
буфер.
Итак, вам нужно либо:
+ Изменить «TCHAR карты для» в char
чтобы GetWindowText()
карты для GetWindowTextA()
вместо этого (также аналогично влияет на все остальные TCHAR
вызов API-функции в вашем коде. Используйте этот подход только при переносе устаревшего кода, предшествующего Юникоду, в C ++ Builder 2009+).
Измените свой код для использования TCHAR
вместо:
TCHAR wname[255];
GetWindowText(hwnd,wname,255);
Измените код, чтобы использовать версию Ansi или Unicode GetWindowText()
непосредственно:
char wname[255];
GetWindowTextA(hwnd,wname,255);
wchar_t wname[255];
GetWindowTextW(hwnd,wname,255);