Welcome to MSDN Blogs Sign in | Join | Help

How to hook command window keystrokes

A customer asked how to hook events for the command window.

 

 

The sample below uses BINDEVENT to hook the WM_KEYDOWN, WM_KEYUP and WM_CHAR messages. It changes all ‘a’ keystrokes to ‘b’.

 

* From C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\winuser.h

 

#define GWL_WNDPROC         (-4)

#define WM_KEYDOWN                      0x0100

#define WM_KEYUP                        0x0101

#define WM_CHAR                         0x0102

 

 

PUBLIC oMyHook as MyHook

oMyHook=NEWOBJECT("MyHook")

 

DEFINE CLASS MyHook AS session

      dwOrigWindProc=0

      dwShNotify=0

      PROCEDURE init

            DECLARE integer GetWindowLong IN WIN32API ;

                  integer hWnd, ;

                  integer nIndex

            DECLARE integer CallWindowProc IN WIN32API ;

                  integer lpPrevWndFunc, ;

                  integer hWnd,integer Msg,;

                  integer wParam,;

                  integer lParam

            THIS.dwOrigWindProc =GetWindowLong(_VFP.HWnd,GWL_WNDPROC)

            cWind="Command"

            WDOCKABLE(cWind,.f.)    && make Command window not dockable

 

            DECLARE integer FindWindowEx IN WIN32API integer, integer,STRING,string

            hwndCmd=FindWindowEx(_screen.HWnd,0,0,cWind)

            BINDEVENT(hwndCmd, WM_KEYDOWN,this,"HandleMsg")

            BINDEVENT(hwndCmd, WM_KEYUP,this,"HandleMsg")

            BINDEVENT(hwndCmd, WM_CHAR,this,"HandleMsg")

      PROCEDURE HandleMsg(hWnd as Integer, msg as Integer, wParam as Integer, lParam as Integer)

            LOCAL nRetvalue

            nRetvalue=0

*           ?PROGRAM(),msg,TRANSFORM(wParam,"@0x"),TRANSFORM(lParam,"@0x")," "

            IF wParam=ASC("a")

                  wParam=ASC("b")

            ENDIF

            DO case

            CASE lParam=WM_KEYDOWN

            CASE lParam=WM_KEYUP

            CASE lParam=WM_CHAR

            ENDCASE

            nRetvalue=CallWindowProc(this.dwOrigWindProc,hWnd,msg,wParam,lParam)

            RETURN nRetvalue

ENDDEFINE

 

Published Thursday, October 20, 2005 12:21 AM by Calvin_Hsia

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# re: How to hook command window keystrokes

Thursday, October 20, 2005 9:27 AM by mschaef
I realize this is for a keyboard handler, so performance isn't critical, but I've always been curious about code like this:

IF wParam=ASC("a")
wParam=ASC("b")
ENDIF

Is it more appropriate to think of ASC("a") as the Fox equivalent of a C 'a', or is it an actual function call every time through?

Thanks,
Mike

# Why does BINDEVENT not work with StatusBar_Change?

Wednesday, March 08, 2006 8:30 PM by Calvin Hsia's WebLog
A customer had a question and sent some code:
 
PUBLIC oHandler
oHandler = NEWOBJECT("StatusBarText")...

Leave a Comment

(required) 
required 
(required) 
 
Page view tracker