The hook application includes the following files:
The following sample illustrates the hook application code:
============HOOKDEMO.C ============ #define INCL_WIN #define INCL_GPI #include <os2.h> #include "hookdemo.h" #pragma linkage (main,optlink) INT main(VOID); /***********************************************************************/ /* Main() - program entry point. */ /***********************************************************************/ MRESULT EXPENTRY LocalWndProc(HWND, ULONG, MPARAM, MPARAM); HAB hab; HWND hFrameWnd; PFNWP SysWndProc; INT main (VOID) { HMQ hmq; FRAMECDATA fcd; QMSG qmsg; if (!(hab = WinInitialize(0))) return FALSE; /***********************************************************************/ /* Initialize our DLL, which holds the system hook routines. */ /***********************************************************************/ InitDLL(hab); if (!(hmq = WinCreateMsgQueue(hab, 0))) return FALSE; /***********************************************************************/ /* Setup the frame control data for the frame window. */ /***********************************************************************/ fcd.cb = sizeof(FRAMECDATA); fcd.flCreateFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_MINMAX | FCF_TASKLIST; fcd.hmodResources = NULLHANDLE; fcd.idResources = HOOKDEMO; /***********************************************************************/ /* Create the frame - it will hold the container control. */ /***********************************************************************/ hFrameWnd = WinCreateWindow(HWND_DESKTOP, WC_FRAME, "HookDemo", 0, 0, 0, 0, 0, NULLHANDLE, HWND_TOP, 0, &fcd, NULL); /***********************************************************************/ /* Verify that the frame was created; otherwise, stop. */ /***********************************************************************/ if (!hFrameWnd) return FALSE; /***********************************************************************/ /* Set an icon for the frame window. */ /***********************************************************************/ WinSendMsg(hFrameWnd, WM_SETICON, (MPARAM)WinQuerySysPointer(HWND_DESKTOP, SPTR_FOLDER, FALSE), NULL); /***********************************************************************/ /* We must intercept the frame window's messages. */ /* We save the return value (the current WndProc), */ /* so we can pass it all the other messages the frame gets. */ /***********************************************************************/ SysWndProc = WinSubclassWindow(hFrameWnd, (PFNWP)LocalWndProc); WinShowWindow(hFrameWnd,TRUE); /***********************************************************************/ /* Standard PM message loop - get it, dispatch it. */ /***********************************************************************/ while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0)) { WinDispatchMsg(hab, &qmsg); } /***********************************************************************/ /* Clean up on the way out. */ /***********************************************************************/ WinDestroyWindow(hFrameWnd); WinDestroyMsgQueue(hmq); WinTerminate(hab); return TRUE; } /***********************************************************************/ /* LocalWndProc() - window procedure for the frame window. */ /* Called by PM whenever a message is sent to the frame. */ /***********************************************************************/ MRESULT EXPENTRY LocalWndProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { char szBuffer[80]; POINTL pt; int x; switch(msg) { /***********************************************************************/ /* Send the message to the usual WC_FRAME WndProc. */ /***********************************************************************/ case WM_COMMAND: switch (SHORT1FROMMP(mp1)) { /***********************************************************************/ /* Start the hook routine - it stops all WM_COMMAND messages. */ /* (which means all these other messages will be ignored). */ /***********************************************************************/ case IDM_START: StartInputHook(); break; case IDM_STOP: StopInputHook(); break; case IDM_EXIT: WinPostMsg(hwnd, WM_CLOSE, 0, 0); break; default: return (*SysWndProc)(hwnd, msg, mp1, mp2); } break; /***********************************************************************/ /* Send the message to the usual WC_FRAME WndProc. */ /***********************************************************************/ default: return (*SysWndProc)(hwnd, msg, mp1, mp2); break; } return FALSE; } ============ HOOKDLL.C ============ #define INCL_WIN #define INCL_DOS #include <os2.h> /***********************************************************************/ /* Global variables. */ /***********************************************************************/ HAB habDLL; HMODULE hMod; PFN pfnInput; /***********************************************************************/ /* InitDLL: This function sets up the DLL and sets all variables */ /***********************************************************************/ void EXPENTRY InitDLL(HAB hab) { habDLL = hab; /***********************************************************************/ /* Load the DLL - actually, just get our module handle. */ /***********************************************************************/ DosLoadModule(NULL, 0, "HOOKDLL", &hMod); /***********************************************************************/ /* Find the address of the input hook procedure. */ /***********************************************************************/ DosQueryProcAddr(hMod, 0, "InputProc", &pfnInput); } /***********************************************************************/ /* StartInputHook: This function starts the hook filtering. */ /***********************************************************************/ void EXPENTRY StartInputHook(void) { /***********************************************************************/ /* Set a hook to our input filter routine. */ /***********************************************************************/ WinSetHook(habDLL, NULLHANDLE, HK_INPUT, pfnInput, hMod); } /***********************************************************************/ /* StopInputHook: This function stops the hook filtering. */ /***********************************************************************/ void EXPENTRY StopInputHook(void) { /***********************************************************************/ /* Drop a hook to our input filter routine. */ /***********************************************************************/ WinReleaseHook(habDLL, NULLHANDLE, HK_INPUT, pfnInput, hMod); /***********************************************************************/ /* Decrement the DLL usage count. */ /***********************************************************************/ DosFreeModule(hMod); } /***********************************************************************/ /* InputProc: This is the input filter routine. */ /* While the hook is active, all messages come here */ /* before being dispatched. */ /***********************************************************************/ BOOL EXPENTRY InputProc(HAB hab, PQMSG pqMsg, ULONG fs) { /***********************************************************************/ /* Check for WM_COMMAND messages. */ /***********************************************************************/ if (pqMsg->msg == WM_COMMAND) { /***********************************************************************/ /* Ignore all WM_COMMAND messages (stops menu processing). */ /***********************************************************************/ return TRUE; } /***********************************************************************/ /* Pass the message on to the next hook in line. */ /***********************************************************************/ return FALSE; } ============ HOOKDEMO.RC ============ #include <os2.h> #include "hookdemo.h" MENU HOOKDEMO BEGIN SUBMENU "Command", IDM_CMD BEGIN MENUITEM "Start", IDM_START MENUITEM "Stop", IDM_STOP MENUITEM "Exit", IDM_EXIT END END ============ HOOKDEMO.H ============ #define HOOKDEMO 256 #define IDM_CMD 400 #define IDM_START 401 #define IDM_STOP 402 #define IDM_EXIT 403 ============ HOOKDEMO.DEF ============ NAME HOOKDEMO WINDOWAPI DESCRIPTION 'PM Hooks Sample' CODE MOVEABLE DATA MOVEABLE MULTIPLE STACKSIZE 24576 HEAPSIZE 10240 PROTMODE ============ HOOKDEMO.LNK ============ hookdemo.obj /NOI hookdemo.exe hookdemo.map hookdll.lib hookdemo.def ============ HOOKDLL.DEF ============ LIBRARY HOOKDLL DESCRIPTION 'PM Hooks Sample' CODE LOADONCALL DATA LOADONCALL PROTMODE EXPORTS InitDLL StartInputHook StopInputHook InputProc ============ HOOKDLL.LNK ============ hookdll.obj /NOI hookdll.dll hookdll.map hookdll.def ============ HOOKDEMO.MAK ============ CC = icc /c /Ge /Gd- /Se /Re /ss /Gm+ LINK = link386 HEADERS = hookdemo.h #------------------------------------------------------------------- # A list of all of the object files. #------------------------------------------------------------------- ALL_OBJ1 = hookdemo.obj ALL_OBJ2 = hookdll.obj all: hookdemo.exe hookdll.dll hookdemo.res: hookdemo.rc hookdemo.h hookdemo.obj: hookdemo.c $(HEADERS) icc /C /Ss /W3 hookdemo.c hookdll.obj: hookdll.c icc /C+ /Ge- /Gm+ hookdll.c hookdll.dll: $(ALL_OBJ2) hookdll.def hookdll.lnk $(LINK) @hookdll.lnk implib hookdll.lib hookdll.def hookdemo.exe: $(ALL_OBJ1) hookdemo.def hookdemo.lnk hookdemo.res hook dll.lib $(LINK) @hookdemo.lnk rc -p -x hookdemo.res hookdemo.exe