I decided that I wanted to be able to have up to two functions per key based on whether I pressed it with the shift key down or not. As an example pressing the Calculator key alone would run the Calculator but pressing the Calculator key while holding down a shift key would run Money.
So I wrote this little program:
Code: Select all
; Microsoft Keyboard Key Enhancer
; written by Tipperton in November 2007
;
; The idea behind this program is instead of assigning keys
; to specific programs or files, assign them to run this
; program renamed to reflect the key it is for.
; For example For the calculator key, rename the program to
; CalculatorKey.exe, then configure the Calculator key to run
; this program instead of the calculator.
;
; Now you can press the key alone to get one function or hold
; down the shift key to get a different function.
;
; You can also hold down the control key to bring up the
; configuration window to set up the normal and shifted
; functions for the key.
; Window Constants
Enumeration
#wndConfig
EndEnumeration
; Gadget Constants
Enumeration
#fraUnshifted
#txtUnshiftedCommand
#strUnshiftedCommand
#btnUnshiftedBrowse
#txtUnshiftedParameters
#strUnshiftedParameters
#fraShifted
#txtShiftedCommand
#strShiftedCommand
#txtShiftedParameters
#btnShiftedBrowse
#strShiftedParameters
#btnOK
#btnCancel
EndEnumeration
Procedure Open_wndConfig(KeyName.s)
If OpenWindow(#wndConfig, #PB_Ignore, #PB_Ignore, 400, 200, "Configure "+KeyName+" key", #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#wndConfig))
Frame3DGadget(#fraUnshifted, 10, 10, 380, 70, "Unshifted")
TextGadget(#txtUnshiftedCommand, 20, 30, 60, 20, "Command:", #PB_Text_Right)
StringGadget(#strUnshiftedCommand, 90, 30, 230, 20, "")
ButtonGadget(#btnUnshiftedBrowse, 320, 30, 60, 20, "Browse")
TextGadget(#txtUnshiftedParameters, 20, 50, 60, 20, "Parameters:", #PB_Text_Right)
StringGadget(#strUnshiftedParameters, 90, 50, 290, 20, "")
Frame3DGadget(#fraShifted, 10, 90, 380, 70, "Shifted")
TextGadget(#txtShiftedCommand, 20, 110, 60, 20, "Command:", #PB_Text_Right)
StringGadget(#strShiftedCommand, 90, 110, 230, 20, "")
ButtonGadget(#btnShiftedBrowse, 320, 110, 60, 20, "Browse")
TextGadget(#txtShiftedParameters, 20, 130, 60, 20, "Parameters:", #PB_Text_Right)
StringGadget(#strShiftedParameters, 90, 130, 290, 20, "")
ButtonGadget(#btnOK, 260, 170, 60, 20, "OK", #PB_Button_Default)
ButtonGadget(#btnCancel, 330, 170, 60, 20, "Cancel")
EndIf
SetActiveWindow_(WindowID(#wndConfig))
EndIf
EndProcedure
; Get status of Shift and Control keys
KeyState.b=0
If GetAsyncKeyState_(#VK_CONTROL)&$8000
KeyState+2
EndIf
If GetAsyncKeyState_(#VK_SHIFT)&$8000
KeyState+1
EndIf
; Get information about program for accessing prefs file
FileSpec.s=ProgramFilename()
PathPart.s=GetPathPart(FileSpec)
FilePart.s=GetFilePart(FileSpec)
ExtPart.s=GetExtensionPart(FileSpec)
FilePart=Left(FilePart, Len(FilePart)-(Len(ExtPart)+1))
KeyName.s=ReplaceString(FilePart, "Key", "")
PrefsFile.s=PathPart+FilePart+".prefs"
; Load preferences if available
If OpenPreferences(PrefsFile)
PreferenceGroup("Unshifted")
UnshiftedCommand.s=Trim(ReadPreferenceString("Command", ""))
If Len(UnshiftedCommand)
If FindString(UCase(UnshiftedCommand), ".EXE", 1)
UnshiftedWindowMode.l=#SW_SHOW
Else
UnshiftedWindowMode=0
EndIf
UnshiftedPath.s=GetPathPart(UnshiftedCommand)
Else
UnshiftedPath=""
EndIf
UnshiftedParameters.s=Trim(ReadPreferenceString("Parameters", ""))
PreferenceGroup("Shifted")
ShiftedCommand.s=Trim(ReadPreferenceString("Command", ""))
If Len(ShiftedCommand)
If FindString(UCase(ShiftedCommand), ".EXE", 1)
ShiftedWindowMode.l=#SW_SHOW
Else
ShiftedWindowMode=0
EndIf
ShiftedPath.s=GetPathPart(ShiftedCommand)
Else
ShiftedPath=""
EndIf
ShiftedParameters.s=Trim(ReadPreferenceString("Parameters", ""))
ClosePreferences()
Else
UnshiftedCommand=""
UnshiftedParameters=""
ShiftedCommand=""
ShiftedParameters=""
KeyState=2
EndIf
; Choose action based on shift and control key state or if there is no prefs file
Select KeyState
; Prefs exist and no shift or control key pressed
Case 0
If Len(UnshiftedCommand)
hInstance.l=ShellExecute_(0, 0, UnshiftedCommand, UnshiftedParameters, UnshiftedPath, UnshiftedWindowMode)
If hInstance>32 Or hInstance<0
SetActiveWindow_(hInstance)
EndIf
Else
PlaySound_("Default", 0, #SND_ALIAS)
EndIf
; Prefs exist and shift key pressed
Case 1
If Len(ShiftedCommand)
hInstance=ShellExecute_(0, 0, ShiftedCommand, ShiftedParameters, ShiftedPath, ShiftedWindowMode)
If hInstance>32 Or hInstance<0
SetActiveWindow_(hInstance)
EndIf
Else
PlaySound_("Default", 0, #SND_ALIAS)
EndIf
; Prefs don't exist or control key pressed
Case 2
Open_wndConfig(KeyName)
SetGadgetText(#strUnshiftedCommand, Trim(UnshiftedCommand))
SetGadgetText(#strUnshiftedParameters, Trim(UnshiftedParameters))
SetGadgetText(#strShiftedCommand, Trim(ShiftedCommand))
SetGadgetText(#strShiftedParameters, Trim(ShiftedParameters))
Repeat ; Start of the event loop
Event=WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID=EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID=EventGadget() ; Is it a gadget event?
EventType=EventType() ; The event type
If Event=#PB_Event_Gadget
If GadgetID=#btnUnshiftedBrowse
NewUnshiftedCommand.s=Trim(OpenFileRequester("Select file to open or run", GetGadgetText(#strUnshiftedCommand), "All files (*.*)|*.*", 1))
If Len(NewUnshiftedCommand)
SetGadgetText(#strUnshiftedCommand, NewUnshiftedCommand)
EndIf
ElseIf GadgetID=#btnShiftedBrowse
NewShiftedCommand.s=Trim(OpenFileRequester("Select file to open or run", GetGadgetText(#strShiftedCommand), "All files (*.*)|*.*", 1))
If Len(NewShiftedCommand)
SetGadgetText(#strShiftedCommand, NewShiftedCommand)
EndIf
ElseIf GadgetID=#btnOK
CreatePreferences(PrefsFile)
PreferenceGroup("Unshifted")
WritePreferenceString("Command", Trim(GetGadgetText(#strUnshiftedCommand)))
WritePreferenceString("Parameters", Trim(GetGadgetText(#strUnshiftedParameters)))
PreferenceGroup("Shifted")
WritePreferenceString("Command", Trim(GetGadgetText(#strShiftedCommand)))
WritePreferenceString("Parameters", Trim(GetGadgetText(#strShiftedParameters)))
ClosePreferences()
Event=#PB_Event_CloseWindow
ElseIf GadgetID=#btnCancel
Event=#PB_Event_CloseWindow
EndIf
EndIf
Until Event=#PB_Event_CloseWindow ; End of the event loop
; Prefs exist and both shift and control key pressed
Default
PlaySound_("Default", 0, #SND_ALIAS)
EndSelect
EndOn further testing it appears that the shifted behavior is from IntelliType Pro itself.
Any ideas how I can solve both problems?
Thanks!

