273 lines
5.6 KiB
C
273 lines
5.6 KiB
C
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#if 0
|
||
|
if(lpMsg->message == WM_CLOSE) {
|
||
|
DbgPrint("HOOK: got WM_CLOSE");
|
||
|
if(GetWindowLong(lpMsg->hwnd,GWL_STYLE) & WS_SYSMENU) {
|
||
|
UINT State = GetMenuState( GetSystemMenu(lpMsg->hwnd,FALSE),
|
||
|
1,
|
||
|
MF_BYPOSITION
|
||
|
);
|
||
|
|
||
|
DbgPrint("; sysmenu state = %lx",State);
|
||
|
}
|
||
|
DbgPrint("\n");
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef SYMTAB_STATS
|
||
|
extern void SymTabStatDump(void);
|
||
|
#endif
|
||
|
|
||
|
HHOOK MsgFilterHook,GetMsgHook;
|
||
|
|
||
|
|
||
|
LRESULT
|
||
|
GetMsgHookProc(
|
||
|
int nCode,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Hook procedure to filter out alt+f4 when the close option in the
|
||
|
system menu is disabled. Alt+f4 is handled in the default window
|
||
|
procedure, and sends a WM_SYSCOMMAND message to the window even
|
||
|
if the close option is disabled. The doc for EnableMenuItem says
|
||
|
that an app that disables items in the system menu must process
|
||
|
the WM_SYSCOMMAND message. This is arguably a bug in user but
|
||
|
what the heck.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
MainInfHandle - supplies handle open txtsetup.inf
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
{
|
||
|
if(nCode == HC_ACTION) {
|
||
|
|
||
|
LPMSG lpMsg = (LPMSG)lParam;
|
||
|
UINT State;
|
||
|
|
||
|
if((lpMsg->message == WM_SYSCOMMAND)
|
||
|
&& ((lpMsg->wParam & 0xfff0) == SC_CLOSE)
|
||
|
&& (GetWindowLong(lpMsg->hwnd,GWL_STYLE) & WS_SYSMENU)) {
|
||
|
|
||
|
State = GetMenuState(
|
||
|
GetSystemMenu(lpMsg->hwnd,FALSE),
|
||
|
SC_CLOSE,
|
||
|
MF_BYCOMMAND
|
||
|
);
|
||
|
|
||
|
if((State != 0xffffffff) && (State & MF_DISABLED)) {
|
||
|
lpMsg->message = WM_NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(0L);
|
||
|
|
||
|
} else {
|
||
|
return(CallNextHookEx(GetMsgHook,nCode,wParam,lParam));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
LRESULT
|
||
|
MsgFilterHookProc(
|
||
|
int nCode,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
|
||
|
{
|
||
|
|
||
|
LPMSG lpMsg = (LPMSG)lParam;
|
||
|
HWND hWnd = NULL;
|
||
|
CHAR szClassName[25];
|
||
|
|
||
|
//
|
||
|
// Examine type of action indicated. We need to process only positive
|
||
|
// valued actions.
|
||
|
//
|
||
|
|
||
|
if ( nCode < 0 ) {
|
||
|
return ( CallNextHookEx(MsgFilterHook,nCode,wParam,lParam) );
|
||
|
}
|
||
|
|
||
|
if((lpMsg->message == WM_KEYDOWN) && (lpMsg->wParam == VK_F6)) {
|
||
|
if(GetKeyState(VK_LCONTROL) & GetKeyState(VK_RCONTROL) & (USHORT)0x8000) {
|
||
|
SdBreakNow();
|
||
|
} else if(GetKeyState(VK_LSHIFT) & GetKeyState(VK_RSHIFT) & (USHORT)0x8000) {
|
||
|
SdTracingOn();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// First check that we received a keyboard message and whether the
|
||
|
// message is for a dialog box
|
||
|
//
|
||
|
|
||
|
if ( lpMsg->message != WM_KEYDOWN || nCode != MSGF_DIALOGBOX) {
|
||
|
return ( fFalse );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Now we have to detetrmine handle of current dialog window.
|
||
|
// We know that class name of all our dialogs is MYDLG so
|
||
|
// I am going through the chain of parent windows for current
|
||
|
// focus windows until I will find parent dialog or NULL.
|
||
|
//
|
||
|
|
||
|
// hWnd = lpMsg->hwnd;
|
||
|
// while ( hWnd ) {
|
||
|
//
|
||
|
// *szClassName = '\0';
|
||
|
//
|
||
|
// GetClassName(
|
||
|
// hWnd,
|
||
|
// (LPSTR)szClassName,
|
||
|
// sizeof(szClassName)
|
||
|
// );
|
||
|
//
|
||
|
// if ( lstrcmpi((LPSTR)szClassName,(LPSTR)CLS_MYDLGS ) == 0 ) {
|
||
|
// break;
|
||
|
// }
|
||
|
//
|
||
|
// hWnd = GetParent( hWnd );
|
||
|
// }
|
||
|
|
||
|
|
||
|
//
|
||
|
// We only want to respond if we are in a child window of the dialog
|
||
|
//
|
||
|
|
||
|
hWnd = lpMsg->hwnd;
|
||
|
|
||
|
if( hWnd && (hWnd = GetParent( hWnd))) {
|
||
|
*szClassName = '\0';
|
||
|
|
||
|
GetClassName(
|
||
|
hWnd,
|
||
|
(LPSTR)szClassName,
|
||
|
sizeof(szClassName)
|
||
|
);
|
||
|
|
||
|
if ( lstrcmpi((LPSTR)szClassName,(LPSTR)CLS_MYDLGS ) != 0 ) {
|
||
|
return ( fFalse );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
return ( fFalse );
|
||
|
}
|
||
|
|
||
|
// //
|
||
|
// // Did we find anything ???
|
||
|
// //
|
||
|
//
|
||
|
// if ( ! hWnd ) {
|
||
|
// return ( fFalse );
|
||
|
// }
|
||
|
|
||
|
//
|
||
|
// Convert keyboard messages came into WM_COMMANDs to
|
||
|
// the found dialog. Return TRUE because we procecessed
|
||
|
//
|
||
|
switch (lpMsg->wParam) {
|
||
|
|
||
|
case VK_F1:
|
||
|
if ( GetDlgItem ( hWnd, IDC_H ) != (HWND)NULL ) {
|
||
|
PostMessage(
|
||
|
hWnd,
|
||
|
WM_COMMAND,
|
||
|
MAKELONG(IDC_H, BN_CLICKED),
|
||
|
(LONG)lpMsg->lParam
|
||
|
);
|
||
|
|
||
|
}
|
||
|
return ( fTrue );
|
||
|
|
||
|
|
||
|
|
||
|
case VK_F3:
|
||
|
if ( GetDlgItem ( hWnd, IDC_X ) != (HWND)NULL ) {
|
||
|
PostMessage(
|
||
|
hWnd,
|
||
|
WM_COMMAND,
|
||
|
MAKELONG(IDC_X, BN_CLICKED),
|
||
|
(LONG)lpMsg->lParam
|
||
|
);
|
||
|
}
|
||
|
return ( fTrue );
|
||
|
|
||
|
|
||
|
#ifdef SYMTAB_STATS
|
||
|
case VK_F2:
|
||
|
SymTabStatDump();
|
||
|
return ( fTrue );
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#if DBG
|
||
|
#ifdef MEMORY_CHECK
|
||
|
case VK_F4:
|
||
|
MemDump();
|
||
|
return ( fTrue );
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return ( fFalse );
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
FInitHook(
|
||
|
VOID
|
||
|
)
|
||
|
|
||
|
{
|
||
|
GetMsgHook = SetWindowsHookEx(
|
||
|
WH_GETMESSAGE,
|
||
|
GetMsgHookProc,
|
||
|
NULL,
|
||
|
GetCurrentThreadId()
|
||
|
);
|
||
|
|
||
|
MsgFilterHook = SetWindowsHookEx(
|
||
|
WH_MSGFILTER,
|
||
|
MsgFilterHookProc,
|
||
|
NULL,
|
||
|
GetCurrentThreadId()
|
||
|
);
|
||
|
|
||
|
return ( fTrue );
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
FTermHook(
|
||
|
VOID
|
||
|
)
|
||
|
|
||
|
{
|
||
|
UnhookWindowsHookEx(GetMsgHook);
|
||
|
UnhookWindowsHookEx(MsgFilterHook);
|
||
|
return ( fTrue );
|
||
|
}
|