clear if __version__ < 8 msgbox("This form will only run in dBase Pluse 8 or higher.","Error") return endif if file('test_trap_grid_keystokes.dbf') // drop table test_trap_grid_keystokes endif if not file('test_trap_grid_keystokes.dbf') create table test_trap_grid_keystokes (id autoinc,d1 character(5),d2 numeric(5,2),; d3 character(5),d4 numeric(5,2)) use test_trap_grid_keystokes generate 20 use endif #include winuser.h ** END HEADER -- do not remove this line // // Generated on 2020-09-25 // parameter bModal local f f = new trap_grid_keystrokesForm() if (bModal) f.mdi = false // ensure not MDI f.readModal() else f.open() endif class trap_grid_keystrokesForm of FORM with (this) onOpen = class::FORM_ONOPEN onClose = class::FORM_ONCLOSE height = 15.4545 left = 10.2857 top = 3.1364 width = 69.8571 text = "" endwith this.TEST_TRAP_GRID_KEYSTOKES1 = new QUERY(this) with (this.TEST_TRAP_GRID_KEYSTOKES1) left = 4.0 width = 14.0 height = 1.0 sql = 'select * from "test_trap_grid_keystokes.DBF"' active = true endwith this.GRID1 = new GRID(this) with (this.GRID1) onGotFocus = class::GRID1_ONGOTFOCUS dataLink = form.test_trap_grid_keystokes1.rowset allowEditing = false height = 9.0 left = 6.0 top = 3.0 width = 56.0 endwith this.ENTRYFIELD1 = new ENTRYFIELD(this) with (this.ENTRYFIELD1) when = {||false} height = 1.0 left = 6.0 top = 13.0 width = 22.0 tabStop = false value = "" endwith this.ENTRYFIELD2 = new ENTRYFIELD(this) with (this.ENTRYFIELD2) height = 1.0 left = 35.0 top = 13.0 width = 8.0 value = "Entryfield2" endwith this.ENTRYFIELD3 = new ENTRYFIELD(this) with (this.ENTRYFIELD3) height = 1.0 left = 50.0 top = 13.0 width = 8.0 value = "Entryfield3" endwith this.rowset = this.test_trap_grid_keystokes1.rowset function form_onOpen if type("GetCurrentThreadId") # "FP" extern CULONG GetCurrentThreadId() kernel32 from "GetCurrentThreadId" endif if type("GetAsyncKeyState") # "FP" extern CSHORT GetAsyncKeyState(CINT) user32 endif if type("GetKeyState") # "FP" extern CSHORT GetKeyState(CINT) user32 endif if type("GetWindowLong") # "FP" extern CLONG GetWindowLong(CHANDLE, CINT) user32 from "GetWindowLongA" endif if type("SetWindowsHookEx") # "FP" extern CLONG SetWindowsHookEx(CINT, CPTR, CHANDLE, CULONG) user32 from "SetWindowsHookExA" endif if type("UnhookWindowsHookEx") # "FP" extern CLOGICAL UnhookWindowsHookEx(CHANDLE) user32 endif if type("CallNextHookEx") # "FP" extern CLONG CallNextHookEx(CHANDLE, CINT, CUINT, CUINT) user32 endif CALLBACK CLONG hookWndProc(CINT, CUINT, CUINT) OBJECT this form.hookProc = GetCallAddress(class::HOOKWNDPROC) form.hInst = GetWindowLong(this.hwnd, GWL_HINSTANCE) form.hook = SetWindowsHookEx(WH_KEYBOARD,form.hookProc,form.hInst, GetCurrentThreadId()) form.mouse_on_grid = true return function hookWndproc(hCode, wParam, lParam) // wParam virtual key code. // lParam bit 31 = 0 keydown, bit 31 = 1 keyup if bitset(lParam,31) = false ; //keydown and hCode = 3 and (wParam = VK_BACK or (wParam >= 0x30 and wParam <= 0x5A)) if form.activeControl = form.grid1 if wParam > 0x39 if GetAsyncKeyState(VK_SHIFT) <>0 or GetKeyState(VK_CAPITAL) <> 0 form.entryfield1.value += chr(wParam) else form.entryfield1.value += chr(wParam+0x20) endif elseif wParam > 0x30 form.entryfield1.value += chr(wParam) endif endif if wParam = VK_BACK form.entryfield1.value = substr(trim(form.entryfield1.value),1,len(trim(form.entryfield1.value))-1) endif //Code to trigger progressive search goes here. endif return CallNextHookEx(form.hook, hCode, wParam, lParam) function GRID1_onGotFocus() form.entryfield1.value = '' return function form_onClose UnhookWindowsHookEx(form.hook) return endclass