2010-02-09 20 views
0

Ainsi, le GetWindowText est déclaré sur MSDN comme suit:TCHAR [], LPWSTR, LPTSTR et GetWindow texte fonction

int GetWindowText(  
    HWND hWnd, 
    LPTSTR lpString, 
    int nMaxCount 
); 

Cependant pour que le code du travail que nous devons déclarer le deuxième paramètre comme

TCHAR[255] WTitle; 

puis appelez la fonction GetWindowText(hWnd,Wtitle,255); LPTSTR est un pointeur sur un tableau de tchar, donc déclarer LPTSTR est similaire à déclarer TCHAR []? Ça ne marche pas comme ça. Lors de l'utilisation de TCHAR [], le programme renvoie un résultat GetWindowText valide (il s'agit d'un nombre entier égal au nombre de symboles du titre). La question est: comment puis-je obtenir le titre exact de TCHAR []? Code comme

TCHAR[255] WTitle; 
cout<< WTitle; 

ou

cout<< *Wtitle; 

numéros de retours. Comment puis-je comparer cela avec une chaîne donnée?

TCHAR[4] Test= __T("TEST") 
if (WTitle == Test) do smth 

ne fonctionne pas aussi.

+1

Étant donné que vous écrivez déjà un programme qui ne peut être compilé de toute façon, envisager le creusement de fossés TCHAR. C'est désespérément archaïque, utilisez wchar_t. –

Répondre

2

OK, quelques premières définitions. Les types 'T' sont des définitions qui vont évaluer CHAR (un octet) ou WCHAR (double octet), selon que vous avez défini le symbole _UNICODE dans vos paramètres de construction. Le but est de vous permettre de cibler à la fois ANSI et UNICODE avec un seul ensemble de code source.

Les définitions:

TCHAR title[100]; 
TCHAR * pszTitle; 

... sont pas équivalent. Le premier définit un tampon de 100 TCHAR. La seconde définit un pointeur vers un ou plusieurs TCHAR, mais ne le pointe pas sur un tampon. De plus,

sizeof(title) == 100 (or 200, if _UNICODE symbol is defined) 
sizeof(pszTitle) == 4 (size of a pointer in Win32) 

Si vous avez une fonction comme ceci:

void foo(LPCTSTR str); 

... vous pouvez passer l'une des deux variables ci-dessus dans:

foo(title); // passes in the address of title[0] 
foo(pszTitle); // passes in a copy of the pointer value 

OK, donc la raison vous obtenez des nombres est probablement parce que ont UNICODE défini (donc les caractères sont larges), et vous utilisez cout, qui est spécifique aux caractères à un octet. Utilisez wcout à la place:

wcout << title; 

Enfin, ceux-ci ne fonctionnera pas:

TCHAR[4] Test == __T("TEST") ("==" is equality comparison, not assignment) 
if (WTitle == Test) do smth (you're comparing pointers, use wcscmp or similar) 
+0

ofc Je voulais dire TCHAR [4] Test = __T (" TEST ") Vous avez donné la réponse la plus complète, merci! – lhj7362

2

Réponse courte: À moins que vous codez pour Win98, utilisez wchar_t au lieu de TCHAR et wcout au lieu de cout

Version longue:

Le type TCHAR existe pour permettre le code à compiler dans la chaîne multiple modes. Par exemple supportant ASCII et Unicode. Le type TCHAR sera compilé conditionnellement au type de caractère approprié en fonction du paramètre.

Tous les nouveaux systèmes Win sont basés sur Unicode. Lorsque les chaînes ASCII sont transmises aux fonctions du système d'exploitation, elles sont converties en unicode et l'appel est la fonction réelle. Il est donc préférable d'utiliser Unicode dans toute votre application.

+0

Merci! Malheureusement, je ne peux pas marquer plusieurs réponses comme acceptées. – lhj7362

1

En C, wchar_t est un typedef pour un certain type entier (généralement court int). En C++, il est nécessaire d'être un type distinct, mais les compilateurs de Microsoft utilisent par défaut un typedef pour cela. Pour en faire un type distinct, vous devez utiliser le commutateur de compilation /Zc:wchar_t. D'un autre côté, je ne sais pas si cela résoudra entièrement le problème - je ne suis pas sûr que la bibliothèque ait de vraies surcharges pour wchar_t en tant que type natif pour les imprimer en tant que caractères au lieu de raccourcis. En règle générale, cependant, je déconseille de jouer avec les variantes "T" de Microsoft - les corriger est un problème, et ils étaient principalement destinés à assurer la compatibilité avec Windows 16 bits de toute façon. Étant donné que cela fait environ 10 ans depuis la dernière version de cette ligne, il est probablement sûr de l'ignorer dans un nouveau code à moins que vous ne soyez vraiment sûr que quelques-uns de vos clients l'utilisent vraiment.

3

Wow, voyons d'où commencer.

Tout d'abord, la déclaration de WTitle doit ressembler à ceci:

TCHAR WTitle[255]; 

Ensuite, si Cout ne écriture fonctionne pas, il est parce que vous êtes en mode Unicode de sorte que vous devez faire ceci:

wcout << WTitle; 

Ou mieux convenir à l'ensemble du cadre de TCHAR, vous pouvez ajouter ce (en fait, je suis surpris que ce n'est pas déjà partie de tchar.h):

#ifdef _UNICODE 
    #define tcout wcout 
#else 
    #define tcout cout 
#endif 

puis utilisez:

tcout << WTitle; 
+0

+1 pour l'utilisation de * tcout * au lieu de * wcout * pour correspondre à TCHAR et LPTCSTR. –

+0

+1 pour afficher wcout. (FYI, googling 'cout lpwstr' donne cela comme le troisième résultat.) – Default