|
|
// fixhelp.cpp : implementation file
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "fixhelp.h"
BOOL g_fDisableStandardHelp = FALSE ;
HHOOK g_HelpFixHook = (HHOOK) 0 ;
LRESULT CALLBACK HelpFixControlProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK HelpFixDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK HelpFixHook( int code, WPARAM wParam, LPARAM lParam) ;
class CWordPadCWnd : public CWnd { public:
LRESULT CallDWP(UINT nMsg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(nMsg, wParam, lParam) ; } } ;
void FixHelp(CWnd* pWnd, BOOL fFixWndProc) { //
// Subclass the main window proc if we are supposed to
// and if MFC has alread subclassed it
//
if (fFixWndProc) { if (GetWindowLongPtr(pWnd->m_hWnd, GWLP_WNDPROC) == (LONG_PTR)AfxWndProc) { SetWindowLongPtr(pWnd->m_hWnd, GWLP_WNDPROC, (LONG_PTR)HelpFixDialogProc); } }
//
// Search all child windows. If their window proc
// is AfxWndProc, then subclass with our window proc
//
CWnd* pWndChild = pWnd->GetWindow(GW_CHILD); while(pWndChild != NULL) { if (GetWindowLongPtr(pWndChild->GetSafeHwnd(), GWLP_WNDPROC) == (LONG_PTR)AfxWndProc) { SetWindowLongPtr(pWndChild->GetSafeHwnd(), GWLP_WNDPROC, (LONG_PTR)HelpFixControlProc); } pWndChild = pWndChild->GetWindow(GW_HWNDNEXT); } }
LRESULT CALLBACK HelpFixControlProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HELP) { //
// bypass MFC's handler, message will be sent to
// parent of the control
//
return DefWindowProc(hwnd, uMsg, wParam, lParam); } return AfxWndProc(hwnd,uMsg,wParam,lParam); }
LRESULT CALLBACK HelpFixDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HELP) { CWordPadCWnd* pWnd = (CWordPadCWnd *) CWnd::FromHandlePermanent(hwnd) ;
//
// bypass MFC's handler, message will be sent to window proc for
// the dialog box
//
if (NULL != pWnd) { return pWnd->CallDWP(uMsg, wParam, lParam) ; } } return AfxWndProc(hwnd,uMsg,wParam,lParam); }
void SetHelpFixHook(void) { g_HelpFixHook = ::SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC) HelpFixHook, NULL, ::GetCurrentThreadId()); }
void RemoveHelpFixHook(void) { ::UnhookWindowsHookEx(g_HelpFixHook) ;
g_HelpFixHook = (HHOOK) 0 ; }
LRESULT CALLBACK HelpFixHook( int code, WPARAM wParam, LPARAM lParam) { if (code < 0) { return ::CallNextHookEx( g_HelpFixHook, code, wParam, lParam) ; }
CWPSTRUCT *pcwps = (CWPSTRUCT *) lParam ;
if (pcwps->message == WM_INITDIALOG) { CWnd *pWnd = CWnd::FromHandlePermanent(pcwps->hwnd) ;
if (pWnd != NULL) { FixHelp(pWnd, TRUE) ; } }
return ::CallNextHookEx( g_HelpFixHook, code, wParam, lParam) ; }
|