Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
RegisterHotKey example
Message
From
10/06/2005 20:39:03
 
 
To
09/06/2005 10:24:59
Héctor Lizarraga
Gobierno Del Edo de Querétaro
Querétaro, Mexico
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Environment versions
Visual FoxPro:
VFP 9
Miscellaneous
Thread ID:
01021780
Message ID:
01022381
Views:
15
Hello,

Sergey already pointed you to my COM object ..
here's an all VFP solution (error handling largely ommitted):

paste into an prg and run:
#include "winkeys.h"

SET SECONDS ON 
PUBLIC oForm
oForm = CREATEOBJECT('oHotKeyTest')
oForm.Show()

DEFINE CLASS oHotKeyTest AS Form

	oHotKey = .NULL.
	ADD OBJECT Label1 AS Label WITH Width = 250, Height = 250
	
	PROCEDURE Init()
		THIS.oHotKey = CREATEOBJECT('oGlobalHotKeys')
		BINDEVENT(THIS.HWnd,WM_HOTKEY,THIS,'HotKeyEvent',4)
		THIS.oHotKey.AddHotKey(THIS.Hwnd,MOD_ALT+MOD_SHIFT,"U",1) && register Alt+Shift+U
		THIS.oHotKey.AddHotKey(THIS.HWnd,MOD_ALT+MOD_CONTROL,"O",2) && register Alt+Strg+O
	ENDPROC

	PROCEDURE Destroy()
		UNBINDEVENTS(THIS.HWnd,WM_HOTKEY)
                THIS.oHotKey.RemoveHotKey(1) && remove either by passing ID
                THIS.oHotKey.RemoveHotKey(THIS.Hwnd,MOD_ALT+MOD_CONTROL,"O") && or by passing the hotkey parameters ..
		THIS.oHotKey = .NULL.
	ENDPROC


	PROCEDURE HotKeyEvent(lnHwnd,uMsg,wParam,lParam)
		IF uMsg = WM_HOTKEY
			THIS.Label1.Caption	= "HotKey pressed:" + CHR(13) + CHR(10) + ;
					"ID: " + ALLTRIM(STR(wParam)) + CHR(13) + CHR(10) + ;
					"Modifiers: " + ALLTRIM(STR(LOWORD(lParam))) + CHR(13) + CHR(10) + ;
					"Virtual Key: " + ALLTRIM(STR(HIWORD(lParam))) + CHR(13) + CHR(10) + ;
					"Time: " + TRANSFORM(DATETIME())
		ENDIF	
	ENDPROC

ENDDEFINE

DEFINE CLASS oGlobalHotKeys AS Custom

	DIMENSION aHotKeys[512,4]
	
	PROCEDURE Init
		DECLARE INTEGER RegisterHotKey IN user32.dll INTEGER, INTEGER, INTEGER, INTEGER
		DECLARE INTEGER UnregisterHotKey IN user32.dll INTEGER, INTEGER		
	ENDPROC
	
	PROCEDURE Destroy
		LOCAL lnRow
		FOR lnRow = 1 TO ALEN(THIS.aHotKeys,1)
			IF THIS.aHotKeys[lnRow,1]
				UnregisterHotKey(THIS.aHotKeys[lnRow,2],lnRow)
			ENDIF
		ENDFOR
		CLEAR DLLS "RegisterHotKey", "UnregisterHotKey"
	ENDPROC

	PROCEDURE AddHotKey(lnHwnd,lnModifiers,lnKey,lnID)
	
		LOCAL lnID, lnApiRet, lnVK
		
		DO CASE
			CASE INLIST(VARTYPE(lnKey),'N','I')
				lnVK = lnKey
			CASE VARTYPE(lnKey) = 'C'
				lnVK = ASC(UPPER(lnKey))
			OTHERWISE
				ERROR 11, "Parameter lnKey invalid"
		ENDCASE
		
		IF !INLIST(VARTYPE(lnID),'N','I') OR !BETWEEN(lnID,1,512)
			ERROR 11, "Parameter lnID invalid"
		ENDIF
			
		lnApiRet = RegisterHotKey(lnHwnd,lnId,lnModifiers,lnVK)

		IF lnApiRet != 0 && succeeded
			THIS.aHotKeys[lnID,1] = .T.
			THIS.aHotKeys[lnID,2] = lnHwnd
			THIS.aHotKeys[lnID,3] = lnModifiers
			THIS.aHotKeys[lnID,4] = lnVK
			RETURN lnID
		ELSE
			RETURN 0
		ENDIF

	ENDPROC
	
	PROCEDURE RemoveHotKey(lnHwnd,lnMofifiers,lnKey)
		
		LOCAL lnID, lnVk, lnApiRet

		DO CASE
			CASE PCOUNT() = 1 && interpret lnHwnd as HotKey ID
				IF !INLIST(VARTYPE(lnHwnd),'N','I') OR !BETWEEN(lnHwnd,1,512)
					ERROR 11, "Parameter lnHwnd invalid"
				ENDIF
				lnID = lnHwnd
				lnHwnd = THIS.aHotKeys[lnID,2]
			CASE PCOUNT() = 3
				DO CASE
					CASE VARTYPE(lnKey) = 'N'
						lnVK = lnKey
					CASE VARTYPE(lnKey) = 'C'
						lnVK = ASC(UPPER(lnKey))
				ENDCASE
				lnId = THIS.GetHotKeyId(lnHwnd,lnMofifiers,lnVK)
			OTHERWISE
				ERROR 11, "Invalid count of parameters"
		ENDCASE
		
		lnApiRet = UnregisterHotKey(lnHwnd,lnID)

		IF lnApiRet != 0 && succeded
			THIS.aHotKeys[lnID,1] = .F. && flag ID as unused
			RETURN 1
		ELSE
			RETURN 0
		ENDIF
	ENDPROC
	
	PROTECTED PROCEDURE GetHotKeyId(lnHwnd,lnModifiers,lnVK)
		LOCAL lnRow
		FOR lnRow = 1 TO ALEN(THIS.aHotKeys,1)
			IF THIS.aHotKeys[lnRow,1] AND THIS.aHotKeys[lnRow,2] = lnHwnd ;
				AND THIS.aHotKeys[lnRow,3] = lnModifiers AND THIS.aHotKeys[lnRow,4] = lnVK
				RETURN lnRow
			ENDIF
		ENDFOR
		RETURN 0
	ENDPROC
	
ENDDEFINE

&& converted C Macros
&& #define LOWORD(l)           ((WORD)((DWORD_PTR)(l) & 0xffff))
FUNCTION LOWORD(pl)
	RETURN BITAND(pl,0xFFFF)
ENDFUNC
&& #define HIWORD(l)           ((WORD)((DWORD_PTR)(l) >> 16))
FUNCTION HIWORD(pl)
	RETURN BITRSHIFT(pl,16)
ENDFUNC
needed constants (save to winkeys.h to run example)
#define WM_HOTKEY		0x0312

#define MOD_ALT         0x0001
#define MOD_CONTROL     0x0002
#define MOD_SHIFT       0x0004
#define MOD_WIN         0x0008

#define VK_BACK           0x08
#define VK_TAB            0x09
#define VK_CLEAR          0x0C
#define VK_RETURN         0x0D
#define VK_SHIFT          0x10
#define VK_CONTROL        0x11
#define VK_MENU           0x12
#define VK_PAUSE          0x13
#define VK_CAPITAL        0x14
#define VK_ESCAPE         0x1B
#define VK_CONVERT        0x1C
#define VK_NONCONVERT     0x1D
#define VK_ACCEPT         0x1E
#define VK_MODECHANGE     0x1F
#define VK_SPACE          0x20
#define VK_PRIOR          0x21
#define VK_NEXT           0x22
#define VK_END            0x23
#define VK_HOME           0x24
#define VK_LEFT           0x25
#define VK_UP             0x26
#define VK_RIGHT          0x27
#define VK_DOWN           0x28
#define VK_SELECT         0x29
#define VK_PRINT          0x2A
#define VK_EXECUTE        0x2B
#define VK_SNAPSHOT       0x2C
#define VK_INSERT         0x2D
#define VK_DELETE         0x2E
#define VK_HELP           0x2F
#define VK_LWIN           0x5B
#define VK_RWIN           0x5C
#define VK_APPS           0x5D
#define VK_SLEEP          0x5F
#define VK_NUMPAD0        0x60
#define VK_NUMPAD1        0x61
#define VK_NUMPAD2        0x62
#define VK_NUMPAD3        0x63
#define VK_NUMPAD4        0x64
#define VK_NUMPAD5        0x65
#define VK_NUMPAD6        0x66
#define VK_NUMPAD7        0x67
#define VK_NUMPAD8        0x68
#define VK_NUMPAD9        0x69
#define VK_MULTIPLY       0x6A
#define VK_ADD            0x6B
#define VK_SEPARATOR      0x6C
#define VK_SUBTRACT       0x6D
#define VK_DECIMAL        0x6E
#define VK_DIVIDE         0x6F
#define VK_F1             0x70
#define VK_F2             0x71
#define VK_F3             0x72
#define VK_F4             0x73
#define VK_F5             0x74
#define VK_F6             0x75
#define VK_F7             0x76
#define VK_F8             0x77
#define VK_F9             0x78
#define VK_F10            0x79
#define VK_F11            0x7A
#define VK_F12            0x7B
#define VK_F13            0x7C
#define VK_F14            0x7D
#define VK_F15            0x7E
#define VK_F16            0x7F
#define VK_F17            0x80
#define VK_F18            0x81
#define VK_F19            0x82
#define VK_F20            0x83
#define VK_F21            0x84
#define VK_F22            0x85
#define VK_F23            0x86
#define VK_F24            0x87
#define VK_NUMLOCK        0x90
#define VK_SCROLL         0x91
the class limits you to 512 hotkeys, the system limit for a hotkey ID is 0xBFFF (49151) per application, i think 512 should be more than enough .. :)


Regards
Christian
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform