?
Ja, da hast du wohl recht! Das Fensterhandle hab ich auch, das rufe ich mit AfxGetMainWnd() in der Hookprozedur ab.
Hier mal mein Code:
LRESULT CALLBACK CTestApp::CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pCwp = (CWPSTRUCT*)lParam;
while(nCode == HC_ACTION)
{
HWND hWnd = pCwp->hwnd;
UINT uMsg = pCwp->message;
CWnd* pFrame;
TCHAR pszClassName[10];
int nCount;
if((uMsg != WM_CREATE) && (uMsg != 0x01E2))
break;
pFrame = CWnd::GetForegroundWindow();
if(pFrame == NULL)
break;
nCount = ::GetClassName(hWnd, pszClassName, sizeof(pszClassName) / sizeof(pszClassName[0]));
if((nCount != 6) || (_tcscmp(pszClassName, _T("#32768")) != 0))
break;
if(::GetProp(pCwp->hwnd, oldProp) != NULL)
break;
WNDPROC wp = (WNDPROC)(LONG_PTR)::GetWindowLong(pCwp->hwnd, GWL_WNDPROC);
if(wp == NULL)
break;
ASSERT(wp != SubclassMenuProc);
if(!SetProp(pCwp->hwnd, oldProp, wp))
break;
if(!SetWindowLong(pCwp->hwnd, GWL_WNDPROC, (DWORD)(DWORD_PTR)SubclassMenuProc))
{
::RemoveProp(hWnd, oldProp);
break;
}
else
::SetProp(AfxGetMainWnd()->GetSafeHwnd(), newProp, (HANDLE)TRUE);
}
return CallNextHookEx(HookProc, nCode, wParam, lParam);
}
Der sollte doch schon stimmen, oder?
So sieht meine InitInstance aus:
[code]
BOOL CTestApp::InitInstance()
{
...
if(HookProc == NULL)
HookProc = ::SetWindowsHookEx(WH_CALLWNDPROC, CTestApp::CallWndProc, theApp.m_hInstance, ::GetCurrentThreadId());
}
Grüsse