WndProc geändert -> Messages global

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich erstelle gerade eine Klassenbibliothek (.dll) um einen Wrapper für das Rendern bestimmter Geometriedaten via DirectX zu ermöglichen bzw. für die Programmierer in unserem Unternehmen, für welche natives C++ der Horror ist zu vereinfachen.

Um gewissen Messages abzufangen habe ich via GetWindowLongPtr die alte WndProc des Zielfensters abgefangen und durch eine neue von mir ersetzt. Ausserdem wird in der neuen WndProc die alte (falls vorhanden) aufgerufen und ihr Rückgabewert zurückgegeben, so dass der User also nichts merken sollte.

Codemässig sieht das so aus:
Code:
// m_device bzw. Device ist eine Zwischenklasse zwischen managed/unmanaged
m_device->m_oldProc = (Device::WndProc)GetWindowLongPtr(hWindow, GWLP_WNDPROC);
		SetWindowLongPtr(hWindow, GWLP_WNDPROC, (LONG_PTR)&NWndProc);
		Device* device = (m_device); // m_device ist ein cli::interior_ptr, das muss weg
		SetWindowLongPtr(hWindow, GWLP_USERDATA, (LONG_PTR)device);

und dann meine "neue" WndProc:
Code:
	static LRESULT __stdcall NWndProc(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam)
	{
		Device* pDev = (Device*)GetWindowLongPtr(hWindow, GWLP_USERDATA);
		if(!pDev)
			return DefWindowProc(hWindow, uMessage, wParam, lParam);
		if(!pDev->m_oldProc)
			return DefWindowProc(hWindow, uMessage, wParam, lParam);
		if(pDev->m_pRenderMgr)
		{
			RenderMgr^ pMgr = (RenderMgr^)System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(IntPtr(pDev->m_pRenderMgr));
			if(pMgr)
			{
				switch(uMessage)
				{
				case WM_LBUTTONDOWN:
					{
						pMgr->MouseDown(Drawing::Point(LOWORD(lParam), HIWORD(lParam)), System::Windows::Forms::MouseButtons::Left);
						break;
					}
				}
			}
		}

		return pDev->m_oldProc(hWindow, uMessage, wParam, lParam);
	}

Rein theoretisch betrachtet funktioniert das Ganze eigentlich wunderbar. Die Funktion wird aufgerufen und bei WM_LBUTTONDOWN wird auch MouseDown des RenderMgrs aufgerufen, das hab ich getestet. Nun gibt es ein Problem:

Sobald ich einmal in mein Fenster (ein Panel in der aktuellen Zielanwendung) klicke, dann ist das Handling der Messages plötzlich global. Ich kann also in Skype klicken, in den Browser, egal wo, es wird immer MouseDown aufgerufen. Bevor ich in das Panel drücke jedoch ist davon nichts zu merken, keine Nachricht wird ausgelöst.

Womit könnte das zusammenhängen?

Gruss
Cromon
 
Zurück