#include <PRO_EXT.H> #include <mmsystem.h> #include <winuser.h> #define MAXHOOKS 100 long oldwindowproc[MAXHOOKS] ; long newwindowhwnd[MAXHOOKS] ; long windowshandle[MAXHOOKS] ; int hookno = 0; LRESULT CALLBACK HandleWindowMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) ; /* void InitHook (ParamBlk *parm) ; void DestroyHook() ; */ void InitHook (ParamBlk *parm) { HWND hSource ; HWND hDest ; int i = 1; int j = 0; int f = 0; // _BreakPoint(); hSource = (HWND) parm->p[0].val.ev_long ; hDest = (HWND) parm->p[1].val.ev_long ; for (i=1; newwindowhwnd[i] != -1 && i <= hookno ; i++) ; if (i <= MAXHOOKS){ for (j=1; windowshandle[j] != (long)hSource && j <= hookno ; j++) ; // Check if already exists if (windowshandle[j] != (long)hSource) // if not then hook it { if (i > hookno){ hookno++ ; } ; newwindowhwnd[i] = (long)hDest ; windowshandle[i] = (long)hSource ; oldwindowproc[i] = GetWindowLong(hSource,GWL_WNDPROC); SetWindowLong(hSource, GWL_WNDPROC, (LONG)HandleWindowMessage); } ; } ; } LRESULT CALLBACK HandleWindowMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT retvalue = 0 ; RECT rect; POINT pt; int i ; for (i=1; windowshandle[i] != (long)hwndDlg && i < hookno ; i++) ; if (windowshandle[i] == (long)hwndDlg) { switch (uMsg){ case WM_CHAR: case WM_KEYUP: case WM_KEYDOWN: case WM_SYSKEYUP: case WM_SYSKEYDOWN: case WM_SYSCHAR: if (wParam != VK_UP && wParam != VK_DOWN && wParam != VK_LEFT && wParam != VK_RIGHT){ SendNotifyMessage((HWND)newwindowhwnd[i],uMsg, wParam, lParam) ; if (wParam == VK_RETURN && uMsg == WM_KEYDOWN) { /* Pass it through VFP */ SendNotifyMessage((HWND)newwindowhwnd[i],WM_CHAR, wParam, lParam) ; }; break ; } case 0x020A: /* Mousewheel, check if the cursor is positioned over the captured window */ GetClientRect(hwndDlg,&rect); MapWindowPoints(hwndDlg,NULL,(LPPOINT)&rect,2); GetCursorPos(&pt); if (!PtInRect(&rect,pt) || (WindowFromPoint(pt) != hwndDlg)) { /* Pass it through VFP */ SendNotifyMessage((HWND)newwindowhwnd[i],uMsg, wParam, lParam) ; break ; }; default: /* Pass it through the activeX control */ return (CallWindowProc((WNDPROC)oldwindowproc[i], hwndDlg, uMsg, wParam, lParam)) ; } } ; return (0) ; } void DestroyHook() { int i = 1 ; for (i=1; i <= hookno; i++){ SetWindowLong((HWND)windowshandle[i], GWL_WNDPROC, oldwindowproc[i]); } ; } void ResetHooks(ParamBlk *parm) { int i; long j = 0; long nHwnd=parm->p[0].val.ev_long ; for (i=1; i <= hookno ; i++){ if (newwindowhwnd[i] == nHwnd){ SetWindowLong((HWND)windowshandle[i], GWL_WNDPROC, oldwindowproc[i]); newwindowhwnd[i] = -1 ; windowshandle[i] = -1 ; oldwindowproc[i] = -1 ; j++ ; } } _RetInt(j,10) ; } FoxInfo myFoxInfo[] = { {"INITHOOK", (FPFI) InitHook, 2, "II"}, {"RESETHOOKS",(FPFI) ResetHooks, 1, "I"}, {"DESTROYHOOK", (FPFI) DestroyHook, CALLONUNLOAD, ""} }; extern "C" { FoxTable _FoxTable = { (FoxTable *)0, sizeof(myFoxInfo) / sizeof(FoxInfo), myFoxInfo }; }O.K. fine, now what ?
SET LIBRARY TO keybhook.dll ADDITIVEthe following code is activated by a timer (only once). I forgot why...
IF THISFORM.hWndDocument = 0 THISFORM.gethwnd ENDIFThe GetHWND method:
DECLARE INTEGER FindWindowEx IN User32.dll INTEGER, INTEGER, STRING, INTEGER nHwnd=FindWindowEx(THISFORM.HWnd,0,0,0) nHwnd=FindWindowEx(nHWnd,0,"ReportAlbum"+CHR(0),0) nHwnd=FindWindowEx(nHWnd,0,"ViewHolder"+CHR(0),0) THISFORM.hWndCrTreeView=FindWindowEx(nHWnd,0,"SysTreeView32"+CHR(0),0) THISFORM.hWndDocument=FindWindowEx(nHWnd,0,"ReportView"+CHR(0),0) inithook(THISFORM.hWndDocument,THISFORM.hwnd) inithook(THISFORM.hWndCrTreeView,THISFORM.hwnd)In the qeuryunload:
=RESETHOOKS(THISFORM.HWnd)One problem remains however: