Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Sending keystrokes to non VFP windows
Message
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00158751
Message ID:
00160067
Views:
32
Here's a version that is a little improved and doesn't have the problem with the CAPS key. BTW, don't send the char's ascii code directly as virtual key code. Use VkKeyScan() WIn32API function to convert to virtual key code and get the status of the shift key.
#DEFINE KEYEVENTF_KEYUP      2
#DEFINE VK_SHIFT          0x10
#define VK_CAPITAL        0x14
DECLARE SHORT VkKeyScan IN Win32API ;
	INTEGER nChar
DECLARE INTEGER SetForegroundWindow IN Win32API;
	INTEGER hWnd
DECLARE INTEGER SetActiveWindow IN Win32API;
	INTEGER hWnd
DECLARE keybd_event IN Win32API;
	INTEGER bVk, INTEGER bScan,;
	INTEGER dwFlags, INTEGER dwExtraInfo
DECLARE INTEGER ShowWindow IN Win32API;
	INTEGER hWnd, INTEGER uShow
DECLARE INTEGER SetFocus IN Win32API AS SetKeybdFocus;
	INTEGER hWnd
lcsentence = "THE quick brown fox jumped over the lazy dogs"
lnhWnd = Is_Run32("Notepad")
clear
IF lnhWnd > 0
	= ShowWindow(lnhWnd, 9)
	= SetActiveWindow(lnhWnd)
	= SetForegroundWindow(lnhWnd)
	= SetKeybdFocus(lnhWnd)
	*-- Store the status of the CAPS key
	llCapsWasOn = CAPSLOCK()
	IF llCapsWasOn
		*-- If CAPS is on, turn it off.
		= keybd_event(VK_CAPITAL, 0, 0, 0)
		= keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0)
	ENDIF
	FOR lni = 1 TO LEN(lcsentence)
		lcchar = SUBSTR(lcsentence, lni, 1)
		*-- Get the virtual key code and the shift status
		*   for the current char.
		lnVKCodeShiftState = VkKeyScan(ASC(lcchar))
		
		*-- Extract the virtual key code
		lnVKCode = MOD(lnVKCodeShiftState, 256)
		
		*-- Extract the shift status.
		*   (Pressed if the bit 0 of the second byte is 1.)
		*   The status of the ALT and CTRL keys can
		*   be controled in the same way but I don't
		*   do it in this example...
		lnShiftCode = INT(lnVKCodeShiftState / 256)
		llShift = BITTEST(lnShiftCode, 0)
		
		IF llShift
			= keybd_event(VK_SHIFT, 0, 0, 0)
		ENDIF
		= keybd_event(lnVKCode, 0, 0, 0)
		= keybd_event(lnVKCode, 0, KEYEVENTF_KEYUP, 0)
		IF llshift
			= keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
		ENDIF
	NEXT
	*-- Restore the status of the CAPS key
	IF llCapsWasOn
		= keybd_event(VK_CAPITAL, 0, 0, 0)
		= keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0)
	ENDIF
ENDIF
Vlad

>Hiya Mark,
>
>I got the following to work (thanks to Vlad Tatavu). The only problem that I seem to be having is that if capslock is on when it starts, it's reversed in what it should be. I played with the CAPSLOCK() function in VFP, but for some reason it didn't have the desired impact. Personally, I think there's got to be less in terms of API calls, but haven't had the time to figure it out. As you'll note, this uses my Is_Run32 function from the download section.
>#DEFINE KEYEVENTF_KEYUP      2
>#DEFINE VK_SHIFT          0x10
>DECLARE INTEGER SetForegroundWindow IN Win32API;
>  INTEGER hWnd
>DECLARE INTEGER SetActiveWindow IN Win32API;
>  INTEGER hWnd
>DECLARE keybd_event IN Win32API;
>  INTEGER bVk, INTEGER bScan,;
>  INTEGER dwFlags, INTEGER dwExtraInfo
>DECLARE INTEGER ShowWindow IN Win32API;
>  INTEGER hWnd, INTEGER uShow
>DECLARE INTEGER SetFocus IN Win32API AS SetKeybdFocus;
>  INTEGER hWnd
>lcsentence = "The quick brown fox jumped over the lazy dogs"
>lnhWnd = Is_Run32("Notepad")
>IF lnhWnd > 0
>  = ShowWindow(lnhWnd, 9)
>  = SetActiveWindow(lnhWnd)
>  = SetForegroundWindow(lnhWnd)
>  = SetKeybdFocus(lnhWnd)
>  FOR lni = 1 TO LEN(lcsentence)
>    lcchar = SUBSTR(lcsentence, lni, 1)
>    llshift = ISUPPER(lcchar)
>    lnchar = ASC(UPPER(lcchar))
>    IF llshift
>      = keybd_event(VK_SHIFT, 0, 0, 0)
>    ENDIF
>    = keybd_event(lnchar, 0, 0, 0)
>    = keybd_event(lnchar, 0, KEYEVENTF_KEYUP, 0)
>    IF llshift
>      = keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
>    ENDIF
>  NEXT
>ENDIF
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform