Inhalt eines Editfelds auslesen und verarbeiten



  • Hi,

    Ich versuche aus einem Edit-Feld einen Text auszulesen.
    Habs jetz folgendermaßen versucht:

    char buffer[1024];
    int z = SendMessage(editHwnd, WM_GETTEXT, (WPARAM)1024, (LPARAM)buffer);
    cerr << z << endl;
    
    for (int i = 0; i < 1024; ++i)
    	cout << console[i];
    

    Das funktioniert auch soweit. Doch bei der Ausgabe passiert folgendes:
    Aus "Hallo" wird zum Beispiel "H a l l o". Ich denke das liegt an Unicode, kenn mich da aber nicht wirklich aus.

    Am liebsten würde ich den Inhalt des Edit-Felds als String haben, um leichter mit ihm weiter arbeiten zu können. Das Edit-Feld hat außerdem einen sehr großen Inhalt. Ich weiß aber nicht wie ich am besten damit umgehen soll. Müsste später in dem String dann nach bestimmten Zeichenfolgen suchen und diese entsprechend auswerten.
    Für gute Tipps wäre ich dankbar.

    Mfg



  • Also wenn ich das bei mir mache kommt der ganz normale Text raus.
    Hier mal mein Code:

    #include <windows.h>
    #include <windowsx.h>
    #include <iostream.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	HWND hEdit;
    	char *buf;
    	unsigned int size;
    
    	hEdit = CreateMainWindow(hInstance);		//Fenster erzeugen
    	size = Edit_GetTextLength(hEdit);			//Länge des Textes abfragenn
    	size++;										//+1, weil der '\0' nicht mitgerechnet wird
    	buf = new char[size];						//Passenden Buffer erstellen
    	Edit_GetText(hEdit,buf,size);				//Text ausleden
    	MessageBox(NULL,buf,"TST",MB_OK|MB_TOPMOST);//Text ausgeben
    	cout << buf;								//Text ausgeben
    	delete buf;									//Speicher wieder frei geben
    	return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    	WNDCLASSEX wndClass =
    	{
    		sizeof(WNDCLASSEX),
    		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
    		MessageHandler,
    		0,
    		0,
    		hInstance,
    		LoadIcon(NULL, IDI_WINLOGO),
    		LoadCursor(NULL, IDC_ARROW),
    		(HBRUSH)GetStockObject(WHITE_BRUSH),
    		NULL,
    		"WindowClass",
    		LoadIcon(NULL, IDI_WINLOGO)
    	};
    
    	RegisterClassEx(&wndClass);
    
    	HWND hWnd = CreateWindowEx((DWORD)NULL,
    						  "WindowClass",
    						  "Hello Windows",
    						  WS_OVERLAPPEDWINDOW |
    						  WS_VISIBLE,
    						  100, 100, 400, 300,
    						  NULL,
    						  NULL,
    						  hInstance,
    						  NULL);
    
    	return CreateWindowEx(0,
    			"EDIT",
    			"TEST",
    			WS_VISIBLE | WS_CHILD,
    			0,0,350,250,
    			hWnd,
    			NULL,
    			hInstance,
    			NULL);
    }
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		case WM_DESTROY:
    					PostQuitMessage(0);
    					return 0;
    				break;
    	}
    	return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    

  • Mod

    Du hast vermutlich ein Unicode Projekt!
    Deine Daten kommen als Unicode zurück, da durch die Compiler-Einstellungen WM_GETTEXTW verwendet wird.

    Nutze TCHAR oder schalte auf MBCS.



  • TCHAR funktioniert zwar nicht, dafür aber MBCS. Danke!

    Noch eine Frage:
    Ich habe eine Klasse (c++), die als private Datenelemente nur HWND(s) hat. Was genau ist ein HWND? Ein Grunddatentyp? Muss der Speicher wieder freigegeben werden? Wenn ja, wie? Danke. 🙂



  • Ein HWND ist ein Handle, mit dem zu auf ein Fenster zugreifen kannst. Es ist zwar ein Pointer, allerdings musst du hier keinen Speicher freigeben. Du musst nur Speicher freigeben, wenn du selbst Speicher anforderst. Hier ein Beispiel:

    int *i_ptr = new int[1000];
    // Hier muss der Speicherbereich freigegeben werden:
    delete[] i_ptr;
    
    int i;
    int *i_ptr = &i;
    //hier musst du keinen speicher freigeben, du hast den Zeiger nur auf eine 
    //vorhandene Variable zeigen lassen. So ähnlich verhält es sich auch mit den HWNDs.
    

    MfG, Jochen



  • Ah, alles klar!

    Noch eine kleine Frage bezüglich eines Edit-Felds:

    Sagen wir ich hab ein Edit-Feld in einer anderen Anwendung, das ich gerne auslesen möchte. Jetzt würde mich interessieren, wann ein neuer Inhalt im Edit Feld steht, bzw. wann Inhalt angefügt wird. Muss ich nun das Edit Feld per z.B. SendMessage pollen um zu wissen, wann sich der Inhalt ändert oder gibt es da eine andere Möglichkeit (z.B. Interrupt) ? Danke.



  • Hat Keiner eine Idee?



  • Man könnte auch in bestimmten Zeitabständen (z.B. 0.5 Sekunden) den Inhalt des Edit-Feldes auslesen und mit dem letzten Wert vergleichen. Ich weiss aber nicht, ob das jetzt so eine saubere/performante Lösung ist. Ist aber auf jeden Fall einfach zu implementieren. Wie man jetzt an ein fremdes Handle kommt, kann ich so spontan nicht sagen.

    MfG, Jochen



  • Verim schrieb:

    Also wenn ich das bei mir mache kommt der ganz normale Text raus.
    Hier mal mein Code:

    #include <windows.h>
    #include <windowsx.h>
    #include <iostream.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	HWND hEdit;
    	char *buf;
    	unsigned int size;
    
    	hEdit = CreateMainWindow(hInstance);		//Fenster erzeugen
    	size = Edit_GetTextLength(hEdit);			//Länge des Textes abfragenn
    	size++;										//+1, weil der '\0' nicht mitgerechnet wird
    	buf = new char[size];						//Passenden Buffer erstellen
    	Edit_GetText(hEdit,buf,size);				//Text ausleden
    	MessageBox(NULL,buf,"TST",MB_OK|MB_TOPMOST);//Text ausgeben
    	cout << buf;								//Text ausgeben
    	delete buf;									//Speicher wieder frei geben
    	return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    	WNDCLASSEX wndClass =
    	{
    		sizeof(WNDCLASSEX),
    		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
    		MessageHandler,
    		0,
    		0,
    		hInstance,
    		LoadIcon(NULL, IDI_WINLOGO),
    		LoadCursor(NULL, IDC_ARROW),
    		(HBRUSH)GetStockObject(WHITE_BRUSH),
    		NULL,
    		"WindowClass",
    		LoadIcon(NULL, IDI_WINLOGO)
    	};
    
    	RegisterClassEx(&wndClass);
    
    	HWND hWnd = CreateWindowEx((DWORD)NULL,
    						  "WindowClass",
    						  "Hello Windows",
    						  WS_OVERLAPPEDWINDOW |
    						  WS_VISIBLE,
    						  100, 100, 400, 300,
    						  NULL,
    						  NULL,
    						  hInstance,
    						  NULL);
    
    	return CreateWindowEx(0,
    			"EDIT",
    			"TEST",
    			WS_VISIBLE | WS_CHILD,
    			0,0,350,250,
    			hWnd,
    			NULL,
    			hInstance,
    			NULL);
    }
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		case WM_DESTROY:
    					PostQuitMessage(0);
    					return 0;
    				break;
    	}
    	return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    

Anmelden zum Antworten