SendMessage schickt Unsinn



  • Ich habe vor ein paar Tagen VisualBasic aufgegeben wegen eines Programmierfehlers von Microsoft (glaubte ich). Das Problem war folgendes:
    Ich sendete mit SendMessage(hWndTV, TVM_EXPAND, 8001, ?weißIchNichtMehr?) die Nachricht an die SysTreeView32 der WindowsMedia Player Library. Als es nach verschiedenen Versuchen nicht funktionierte, habe ich mit Spy++ herausgefunden, dass statt 0x00008001 0xFFFF8001 angekommen war. Der lParam hatte immer irgendeinen unsinnigen Wert. Deshalb bin ich auf Visual C++ umgestiegen. Innerhalb kurzer Zeit hab ich es geschafft ein neues Item in die fremde TreeView einzufügen. Einen Tag später hat das ganze plötzlich nicht mehr funktioniert. Die Pointer auf die TVINSERTSTRUCT waren im Programmcode und in der abgefangenen Nachricht über Spy++ identisch, aber immer gleich:0012FEFC (glaub ich) auch nach einem Neustart des PCs, wo sich doch eigentlich der Zeiger auf die Speicherstelle verändert haben müsste. wParam und uMsg stimmten auch noch überein. Aber die TVINSERTSTRUCT in lParam gaben jedesmal irgendwelche Werte zurück, die ich auf keinen Fall so definiert habe.

    Jetzt sitze ich seit zwei Tagen da, drehe und wende das Programm und es FUNKTIONIERT EINFACH NICHT MEHR!!! 😡
    Hilft mir bitte ich bin am verzweifeln...

    //Imports
    #include <windows.h>		//Fensterprozeduren
    #include <commctrl.h>
    #include <winuser.h>
    
    //Deklarationen
    HWND FindWindowMN();
    int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    
    //Variablen
    LONG OldWndProc;
    
    //Einsprungsfunktion
    int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
       TVINSERTSTRUCTA pTvInsert;
    	TVITEMA         pItem;
    	HWND           hWndTV;
    	HTREEITEM      hItem;
    	DWORD dwError;
    
    	SetLastError(0);
    	dwError = GetLastError();
    
    	//Definiere Window-handle der Medienbibliotheksnavigation
    	hWndTV = FindWindowMN();
    	if(SendMessage(hWndTV, TVM_GETCOUNT, 0, 0) == 0)
    	{
    		if   (hWndTV == 0) MessageBox(NULL, "Fenster nicht gefunden", "Fehler", 0);
    		else MessageBox(NULL, "Fenster ist keine TreeView", "Fehler", 0);
    		return 0;
    	}
    
    	OldWndProc = GetWindowLong(hWndTv, GWL_WNDPROC);
    	if (!(SetWindowLong(hWndTV, GWL_WNDPROC, (LONG) &NewWndProc))) MessageBox(0, "WNDPROC konnte verändert werden", "Fehler", 0);
    
    	pTvInsert.hInsertAfter = TVI_LAST;
    	pTvInsert.hParent = TVI_ROOT;
    	pTvInsert.item.cChildren = 0;
    	pTvInsert.item.cchTextMax = 10;
    	pTvInsert.item.hItem = 0;
    	pTvInsert.item.iImage = 0;
    	pTvInsert.item.iSelectedImage = 0;
    	pTvInsert.item.lParam = 0;
    	pTvInsert.item.mask = TVIF_TEXT;
    	pTvInsert.item.pszText = "Testentry";
    	pTvInsert.item.state = 0;
    	pTvInsert.item.stateMask = 0;
    
    	//Neues Element einfügen
    	hItem = TreeView_InsertItem(hWndTV, &pTvInsert);
    	dwError = GetLastError();
    	if (hItem == 0) MessageBox(NULL, (const char *) GetLastError(), "Fehler", 0);
    
    	/*Neues Element anpassen
    	pItem.mask = TVIF_HANDLE;
    	pItem.hItem = hItem;
    	if(SendMessage(hWndTV, TVM_GETITEM, 0, (LONG) &pItem) == 0)
    	{
    		MessageBox(NULL, "Item konnte nicht geladen werden", "Fehler", 0);
    	}
    	else
    	{
    		pItem.mask = pItem.mask || TVIF_TEXT;
    		pItem.pszText = "Sampler";
    		SendMessage(hWndTV, TVM_SETITEM, 0, (LONG) &pItem);
    	}
    	*/
    	return 0;
    }
    
    //Findet die TreeView der Mediennavigation
    HWND FindWindowMN()
    {
    	HWND hwndTopLevel;
    	HWND hwndRet;
    
    	hwndTopLevel = FindWindow("WMPlayerAPP", NULL);
    	hwndRet = FindWindowEx(hwndTopLevel, NULL, "WMPAppHost", NULL);
    	hwndRet = GetWindow(hwndRet, GW_CHILD);
    	hwndRet = GetWindow(hwndRet, GW_CHILD);
    	return FindWindowEx(hwndRet, NULL, "SysTreeView32", NULL);
    }
    
    //Neue Fensterprozedur
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	const char charHWND   = (const char) hwnd;
    	const char charLPARAM = (const char) &lParam;
    	MessageBox(NULL, *charLPARAM, *charHWND, 0);
    }
    

    Die restlchen Unfertigkeiten sind egal, ich hab das mal schnell beim Arbeiten kopiert!


Anmelden zum Antworten