文書番号: 401996
最終更新日: 2003/11/12
MFC 2.x のソースコードの抜粋 (appgray.cpp) // Win31 supports CBT window create hook if (_afxHHookOldCbtFilter == NULL) _afxHHookOldCbtFilter = SetWindowsHookEx(WH_CBT, (HOOKPROC)_AfxCbtFilterHook, _AfxGetHookHandle(), ::GetCurrentTask());_afxHHookOldCbtFilter に MFC 2.x がチェインする (MFC 2.x 独自のフック関数の終了 後に実行する) ために元のフック関数のアドレスを保存しています。MFC 2.0 ではこの _afxHHookOldCbtFilter を初期値 NULL のグローバル変数として定義しており、
HHOOK _afxHHookOldCbtFilter=NULL; LRESULT CALLBACK EXPORT _afxCbtFilterHook(int,WPARAM,LPARAM); LRESULT CALLBACK EXPORT _afxGrayBackgroundWndProc(HWND,UINT,WPARAM,LPARAM); HBRUSH afxDlgBkBrush; COLORREF afxDlgTextClr; LRESULT (CALLBACK EXPORT *lpfnDlgWndProc)(HWND,UINT,WPARAM,LPARAM);
BOOL ProjectApp::InitInstance( ) { ... 他の初期化処理 ... if (lpfnDlgWndProc == NULL) // only set once { // get info about standard dialog wnd proc WNDCLASS wndcls; VERIFY(::GetClassInfo(NULL, WC_DIALOG, &wndcls)); lpfnDlgWndProc = wndcls.lpfnWndProc; } afxDlgBkBrush=(HBRUSH)::GetStockObject(LTGRAY_BRUSH); _afxHHookOldCbtFilter = SetWindowsHookEx(WH_CBT, (HOOKPROC)_afxCbtFilterHook, AfxGetInstanceHandle(), ::GetCurrentTask()); }
LRESULT CALLBACK EXPORT _AfxGrayBackgroundWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { if (afxDlgBkBrush != NULL && nMsg == WM_CTLCOLOR && CWnd::GrayCtlColor((HDC)wParam, (HWND)LOWORD(lParam), (UINT)HIWORD(lParam), afxDlgBkBrush, afxDlgTextClr)) { return (LRESULT)(WORD)afxDlgBkBrush; } #ifdef STRICT return CallWindowProc(lpfnDlgWndProc, hWnd, nMsg, wParam, lParam); #else return CallWindowProc((FARPROC)lpfnDlgWndProc, hWnd,nMsg,wParam,lParam); #endif } LRESULT CALLBACK EXPORT _AfxCbtFilterHook(int code, WPARAM wParam, LPARAM lParam) // WH_CBT 用フィルタ関数 { static HWND hWndHookParentDlg = NULL; if (code == HCBT_CREATEWND) { ASSERT(lParam != NULL); LPCREATESTRUCT lpcs = ((LPCBT_CREATEWND)lParam)->lpcs; ASSERT(lpcs != NULL); if (lpcs->lpszClass == WC_DIALOG) { hWndHookParentDlg = (HWND)wParam; // hook it } else if (hWndHookParentDlg != NULL) { // first control in a dialog dynamically subclass the parent // is still a WC_DIALOG if ((WNDPROC)GetWindowLong(hWndHookParentDlg, GWL_WNDPROC) == lpfnDlgWndProc) { (WNDPROC)SetWindowLong(hWndHookParentDlg, GWL_WNDPROC, (DWORD)_AfxGrayBackgroundWndProc); } hWndHookParentDlg = NULL; } } // just call default handler and return the result return CallNextHookEx(_afxHHookOldCbtFilter, code, wParam, lParam); }
Keywords: KBBUG KB401996
Technology: kbAudDeveloper kbVCsearch