
I thought to do the trick by swaping key functions but this leads to an endless loop...
My code below just changes the END and INSERT key for the moment, much more has to be done later on. Pressing the END key does to the trick with the code below, but... when removing the semicolon from the line ;Debug RegisterHotKey_(Win,#HotkeyLineEnd,#MOD_NULL,#VK_INSERT) the drama starts...
One idea would be to unregister the hotkeys while sending the right keys and then registering them again, but maybe there's a more elegant solution?
Code: Select all
; Define
EnableExplicit
#Delet= Chr(5)
#Insert= Chr(6)
#Back= Chr(8)
#Tabstop= Chr(9)
#Enter= Chr(13)
#Shift= Chr(16)
#Control= Chr(17)
#Alt= Chr(18)
#Win= Chr(19)
#ShiftUp= Chr(20)
#ControlUp=Chr(21)
#AltUp= Chr(22)
#WinUp= Chr(23)
#Home= Chr(24)
#End= Chr(25)
#Escape= Chr(27)
#Shift_= 16
#WinUp_= 23
#Delet_= 5
#Insert_= 6
#Home_= 24
#End_= 25
Enumeration
#HotkeyInsert; Insert
#HotkeyPaste; Shift+ Insert
#HotkeyXXX; Shift+Control+ Insert
#HotkeyCopy; Control+ Insert
#HotkeyLineEnd; End
#HotkeySelectToLineEnd; Shift+ End
#HotkeySelectToDocumentEnd; Shift+Control+ End
#HotkeyDocumentEnd; Control+ End
#HotkeyCopyScreen; PrintScr
#HotkeyCopyWindow; Alt+ PrintScr
#HotkeyCopyArea; Control+ PrintScr
#HotkeyDefineArea; Control+Shift+ PrintScr
EndEnumeration
#MOD_NULL=0
; EndDefine
Procedure SendKeys(keys.s)
Protected.i n,vk,up
Protected.i keyshift,layout
Protected.s s,t
BlockInput_(#True)
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
GetKeyboardLayout_(GetWindowThreadProcessId_(GetForegroundWindow_(),0))
For n=1 To Len(keys)
vk=Asc(Mid(keys,n,1))
up=#Null
Select vk
Case #Shift_ To #WinUp_
If vk>19 : up=#KEYEVENTF_KEYUP : vk-4 : EndIf
If vk=19 : vk=91 : EndIf
keybd_event_(vk,0,up,0)
Case #Delet_
vk=#VK_DELETE
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0)
Case #Insert_
vk=#VK_INSERT
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0)
Case #Home_
vk=#VK_HOME
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0)
Case #End_
vk=#VK_END
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0)
Default
vk=VkKeyScanEx_(vk,layout)
up=vk >> 8
vk & $ff
If up&1
keybd_event_(#VK_SHIFT,0,0,0)
EndIf
If up&2
keybd_event_(#VK_CONTROL,0,0,0)
EndIf
If up&4
keybd_event_(#VK_MENU,0,0,0)
EndIf
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0)
If up&1
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0)
EndIf
If up&2
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
EndIf
If up&4
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0)
EndIf
EndSelect
Next n
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0)
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
BlockInput_(#False)
ProcedureReturn #True
EndProcedure
#Window=1
Global win
Win=OpenWindow(#Window,300,250,400,200,"Swap End / Insert",#PB_Window_SystemMenu)
Debug RegisterHotKey_(Win,1001,#MOD_NULL, #VK_SNAPSHOT)
Debug RegisterHotKey_(Win,1001,#MOD_SHIFT, #VK_SNAPSHOT)
Debug RegisterHotKey_(Win,1002,#MOD_ALT, #VK_SNAPSHOT)
Debug RegisterHotKey_(Win,1003,#MOD_CONTROL,#VK_SNAPSHOT)
Debug RegisterHotKey_(Win,1004,#MOD_SHIFT, #VK_SNAPSHOT)
;Debug RegisterHotKey_(Win,#HotkeyLineEnd, #MOD_NULL, #VK_INSERT)
Debug RegisterHotKey_(Win,2002, #MOD_SHIFT, #VK_INSERT)
Debug RegisterHotKey_(Win,#HotkeyInsert ,#MOD_NULL, #VK_END)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_HOTKEY
Select EventwParam()
Case #HotkeyLineEnd
Debug "END"
SendKeys(#End)
Case #HotkeyInsert
Debug "INS"
SendKeys(#Insert)
EndSelect
Debug EventwParam()
EndSelect
ForEver