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!