2015-07-12 2 views
0

Im пытается получить активный заголовок окна с помощью GetForegroundWindow и GetWindowText функции, и это мой кодОшибка: Не удается преобразовать символ в wchat_t *

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

И Everytime я пытаюсь построить проект я получаю сообщение об ошибке " Ошибка: Ошибка: не удается преобразовать символ в wchat_t *»

Im использованием строитель xe7

Итак, что случилось C++?

+0

Я думаю, вы найдете его 'wchar_t', а не wchat_t –

ответ

0

Вы создаете приложение в режиме Unicode; a 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); 

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

+4

« Самое правильное »решение - использовать unicode везде. Это не 1995 год. –

+0

Абсолютно нет.Если он просто слепо использовал Unicode повсюду, а затем позже или он переключил текстовый режим (представьте, что вы переносите на устаревшую Windows или потенциально переносите на новый стандарт Unicode или изобретаете правдоподобную причину), тогда все будет разваливаться , Макросы являются неудобством, но они бесконечно предпочтительнее жесткого кодирования выбора в каждой отдельной переменной. – acwaters

+0

@JonathanPotter Самое правильное - использовать UTF-8, потому что UTF-16 является устаревшим компромиссом для поддержки систем, жестко кодирующих 16-битные коды Unicode 1.0 (до 1996 года). 'char' не означает ASCII; это единственное эффективное представительство, а остальная часть мира продвинулась вперед с UTF-8. – Potatoswatter

3

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

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

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

  2. Изменить код, чтобы использовать TCHAR вместо:

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

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

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