Re: How to send a keystroke (say, {ENTER}) to other Windows process? by Christian
Christian
Thu Feb 28 10:04:35 CST 2008
Hi,
here's a little VFP class i've written a few years ago.
Use the api function "SetforegroundWindow" to the window to send the
text to before using it.
Christian
DEFINE CLASS oKeySender AS Custom
#DEFINE KEYEVENT_KEYDN 0x0
#DEFINE KEYEVENT_KEYUP 0x2
#DEFINE VK_SHIFT 0x10
#DEFINE VK_CTRL 0x11
#DEFINE VK_ALT 0x12
FUNCTION Init
DECLARE keybd_event IN USER32 INTEGER, INTEGER, INTEGER, INTEGER
DECLARE SHORT VkKeyScan IN USER32 INTEGER
DECLARE INTEGER MapVirtualKey IN USER32 INTEGER, INTEGER
ENDFUNC
FUNCTION Destroy
CLEAR DLLS "keybd_event", "VkKeyScan", "MapVirtualKey"
ENDFUNC
FUNCTION SendText
LPARAMETERS lcText
LOCAL lnAscii, lcChar, lnVK, nShift, nCtrl, nAlt
FOR xj = 1 TO LEN(lcText)
lcChar = SUBSTR(lcText,xj,1)
lnAscii = ASC(lcChar)
lnVK = VkKeyScan(lnAscii)
IF lnVK = 0
LOOP
ENDIF
lnScan = MapVirtualKey(lnVK,2)
lnExtended = 0
IF lnScan = 0
lnExtended = 1
ENDIF
lnScan = MapVirtualKey(lnVK, 0)
nShift = BITAND(lnVK,0x100)
nCtrl = BITAND(lnVK,0x200)
nAlt = BITAND(lnVK,0x400)
lnVK = BITAND(lnVK,0xFF)
IF nShift > 0
keybd_event(VK_SHIFT,0,KEYEVENT_KEYDN,0)
ENDIF
IF nCtrl > 0
keybd_event(VK_CTRL,0,KEYEVENT_KEYDN,0)
ENDIF
IF nAlt > 0
keybd_event(VK_ALT,0,KEYEVENT_KEYDN,0)
ENDIF
&& press the key
keybd_event(lnVK,lnScan,lnExtended,0)
&& release the key
keybd_event(lnVK,lnScan,BITOR(2,lnExtended),0)
IF nShift > 0
keybd_event(VK_SHIFT,0,KEYEVENT_KEYUP,0)
ENDIF
IF nCtrl > 0
keybd_event(VK_CTRL,0,KEYEVENT_KEYUP,0)
ENDIF
IF nAlt > 0
keybd_event(VK_ALT,0,KEYEVENT_KEYUP,0)
ENDIF
ENDFOR
ENDFUNC
FUNCTION SendKeyCombi
LPARAMETERS lnModifier, lcText
LOCAL lnAscii
IF BITTEST(lnModifier,0)
keybd_event(VK_SHIFT,0,KEYEVENT_KEYDN,0)
ENDIF
IF BITTEST(lnModifier,1)
keybd_event(VK_CTRL,0,KEYEVENT_KEYDN,0)
ENDIF
IF BITTEST(lnModifier,2)
keybd_event(VK_ALT,0,KEYEVENT_KEYDN,0)
ENDIF
DO CASE
CASE VARTYPE(lcText) = 'C'
lnAscii = ASC(lcText)
CASE VARTYPE(lcText) = 'N' OR VARTYPE(lcText) = 'I'
lnAscii = lcText
OTHERWISE
lnAscii = ASC(TRANSFORM(lcText))
ENDCASE
&& press the key
keybd_event(lnAscii,0,KEYEVENT_KEYDN,0)
&& release the key
keybd_event(lnAscii,0,KEYEVENT_KEYUP,0)
IF BITTEST(lnModifier,0)
keybd_event(VK_SHIFT,0,KEYEVENT_KEYUP,0)
ENDIF
IF BITTEST(lnModifier,1)
keybd_event(VK_CTRL,0,KEYEVENT_KEYUP,0)
ENDIF
IF BITTEST(lnModifier,2)
keybd_event(VK_ALT,0,KEYEVENT_KEYUP,0)
ENDIF
ENDFUNC
ENDDEFINE