2010-09-03 7 views
0

J'ai un problème mineur avec EM_GETLINE. J'ai une zone de texte dont je veux extraire le texte. La boîte continue à être mise à jour tout le temps (c'est un fichier journal qui continue à être mis à jour, le dernier message en bas). Tout ce que je veux c'est cette toute dernière ligne.Erreur EM_GETLINE C++ Obtenir la dernière ligne de TextBox

Mon code:

 HWND hwnd = (HWND)0x00020A72; 
TCHAR param[1000]; 
char display[1000]; 
LONG lResult; 
lResult = SendMessage(hwnd, WM_GETTEXT, 500, (LPARAM)param); 
//lResult = SendMessage(hwnd, EM_STREAMOUT, SF_RTF, (LPARAM)param); 
//lResult = SendMessage(hwnd, EM_GETLINE, 1, (LPARAM)param); 
wcstombs(display, param, 1000); 

printf(" %s\n", display); 

Comme vous pouvez le voir, je l'ai essayé WM_GETTEXT (qui fonctionne). Lorsque vous utilisez GETLINE, il compile nice (VS2010express) mais renvoie des déchets.

Serait vraiment reconnaissant de l'aide. Merci d'avoir écouté.

+1

Lire la doc: "Avant d'envoyer le message, définissez le premier mot de ce tampon à la taille, dans TCHAR, du tampon." – anno

+0

J'ai vu ça, mais je suis assez nouveau dans ce domaine et je ne suis pas sûr de ce qu'ils signifient. On dirait une énigme pour moi ... – Rocky

+0

Voir ce fil: http://www.gamedev.net/community/forums/topic.asp?topic_id=147943 – anno

Répondre

1

Vous devriez demander le dernier pas la première ligne et ajoutez la valeur NULL pour la fin, procédez comme suit:

int last_line = SendMessage(hwnd, EM_GETLINECOUNT,0 ,0) - 1; 
int size = SendMessage(hwnd, EM_GETLINE, (WPARAM)last_line, (LPARAM)param); 
param[size] = 0;//EM_GETLINE does not add the NULL 
+0

Eh bien j'ai essayé votre sugestion mais je reçois 0 comme la taille. La ligne comptant d'autre part est fonctionne et est correcte ... ;-( Toute idée pourquoi la taille est 0? Merci – Rocky

+0

@Rocky Documentation dit que la valeur de retour est zéro lorsque la ligne est fausse. Le hwnd appartient à un autre processus – Tassos

+1

Ce n'est pas le problème Le problème ici est que vous n'arrivez pas à initialiser le tampon pour maintenir la taille de la mémoire tampon dans son premier mot: '((WORD *) param) [0] = bufferSize; 'avant d'envoyer' EM_GETLINE' – IInspectable

2

Cette fenêtre appartient à un autre processus, non? Je peux vous voir codé en dur la poignée de la fenêtre. Pas si sûr que le message est automatiquement marshalé à travers les limites de processus, seul le message système sont (WM_Xxx < 0x400). Le marshaling vous-même nécessite OpenProcess, VirtualAllocEx pour allouer le tampon, WriteProcessMemory pour l'initialiser, SendMessage, ReadProcessMemory pour lire le tampon. Plus de nettoyage.

Questions connexes