Code: Select all
XM=DesktopMouseX()
YM=DesktopMouseY()
Is there a similar command for a keyboard last key press in any program, you know, the last key that was pressed while the PB program is running but not necessarily the active window?
Code: Select all
XM=DesktopMouseX()
YM=DesktopMouseY()
Code: Select all
;-Keyboardhook
Structure akey
ks.a[256]
EndStructure
Procedure ProcessKeys(key.s,back=0)
Debug key
EndProcedure
Procedure.i KeyProc(nCode.l,wParam.l,lParam.l)
Protected *keyInput.KBDLLHOOKSTRUCT
Static keys.akey
Static pos,len
Protected ret.i, hwnd.i,thwnd.i
Protected rs.s=Space(2)
Protected doc
ret = CallNextHookEx_(myKeyhook, nCode, wParam, lParam)
*keyInput = lParam
If nCode = #HC_ACTION
hwnd = GetForegroundWindow_()
Select wParam
Case #WM_KEYUP
keys\ks[*keyInput\vkCode]= $fe
If (GetAsyncKeyState_(#VK_SHIFT) & $8000)
keys\ks[#VK_SHIFT]=$fe
EndIf
If (GetAsyncKeyState_(#VK_CONTROL) & $8000)
keys\ks[#VK_CONTROL]=$fe
EndIf
If (GetAsyncKeyState_(#VK_LMENU) & $8000)
keys\ks[#VK_LMENU]=$fe
EndIf
If (GetAsyncKeyState_(#VK_RMENU) & $8000)
keys\ks[#VK_RMENU]=$fe
EndIf
If (keys\ks[#VK_ESCAPE] = 0 And keys\ks[#VK_LBUTTON] = 0)
If ToUnicode_(*keyInput\vkCode,*keyInput\scanCode,@keys,@rs,1,2)
ProcessKeys(rs,keys\ks[#VK_BACK])
EndIf
EndIf
keys\ks[*keyInput\vkCode]=0
keys\ks[#VK_SHIFT]=0
keys\ks[#VK_CONTROL]=0
keys\ks[#VK_LMENU]=0
keys\ks[#VK_RMENU]=0
EndSelect
EndIf
ProcedureReturn ret
EndProcedure
Procedure SetHooks(hInstance=0)
If hInstance = 0
hInstance = GetModuleHandle_(0)
EndIf
If hInstance
myKeyhook = SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyProc(),hInstance,0)
Else
MessageRequester("hook", "can't get module handle")
EndIf
EndProcedure
Procedure KillHooks()
UnhookWindowsHookEx_(myKeyhook)
myKeyHook = 0
EndProcedure
OpenWindow(0,0,0,100,60,"Hook")
SetHooks()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
KillHooks()