this works for me.
Code: Select all
EnableExplicit
; German forum:
; Author: Danilo
; Date: 07. April 2003
; OS: Windows
; Demo: No
Procedure keybd_event(VK.i, D1.i, Flag.i, D2.i)
Protected Dim SendInputData.INPUT(1)
SendInputData(0)\type = #INPUT_KEYBOARD
SendInputData(0)\ki\dwFlags = Flag
SendInputData(0)\ki\wVK = VK
SendInput_(1, @SendInputData(0), SizeOf(INPUT))
EndProcedure
; Posted 07 April 2003 by Danilo on german forum
;SendKeys(handel,Window$,Keys$)
;Handel ......... ist ein Handel zu einen Fenster bekommst du wenn du das Fenster erzeugst.
;Window$ ........ Ist der Name des Fesnters, wenn du den Handel nicht kennst. In dem Fall gibt man dan Handel = 0 an.
;Keys$ .......... Sind die Tasten die du schicken möchtest, wobei du Sondertasten in {} Einschliest (zb. {CONTROLDOWN})
; SendKeys procedure by PB -- do whatever you want with it. :)
; Syntax: r=SendKeys(handle,window$,keys$) ; r = 0 for failure.
; Specify either a handle or window$ title to type to, but not both!
; You cannot type curly braces { } as part of the keystrokes, sorry!
;
Procedure SendKeys(handle.i, window$, keys$)
Protected.i s, thread1, thread2, r, vk, shifted, Result, KeyLen
Protected s$, vk$
; Use window$ instead of handle.
If window$ <> ""
handle = FindWindow_(0, window$)
EndIf
If IsWindow_(handle) ; Does the target window actually exist?
; This block gives the target window the focus before typing.
thread1 = GetWindowThreadProcessId_(GetForegroundWindow_(), 0)
thread2 = GetWindowThreadProcessId_(handle, 0)
If thread1 <> thread2
AttachThreadInput_(thread1, thread2, #True)
EndIf
SetForegroundWindow_(handle) ; Target window now has the focus for typing.
Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems.
; Now the actual typing starts.
KeyLen = Len(keys$)
For r = 1 To KeyLen
vk$ = Mid(keys$, r, 1)
If vk$ = "{" ; Special key found.
s = FindString(keys$, "}", r + 1) - (r + 1) ; Get length of special key.
s$ = Mid(keys$, r + 1, s) ; Get special key name.
Select s$ ; Get virtual key code of special key.
Case "ALTDOWN" : keybd_event(#VK_MENU, 0, 0, 0) ; Hold ALT down.
Case "ALTUP" : keybd_event(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0) ; Release ALT.
Case "BACKSPACE" : vk = #VK_BACK
Case "CONTROLDOWN" : keybd_event(#VK_CONTROL, 0, 0, 0) ; Hold CONTROL down.
Case "CONTROLUP" : keybd_event(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0) ; Release CONTROL.
Case "DELETE" : vk = #VK_DELETE
Case "DOWN" : vk = #VK_DOWN
Case "END" : vk = #VK_END
Case "ENTER" : vk = #VK_RETURN
Case "F1" : vk = #VK_F1
Case "F2" : vk = #VK_F2
Case "F3" : vk = #VK_F3
Case "F4" : vk = #VK_F4
Case "F5" : vk = #VK_F5
Case "F6" : vk = #VK_F6
Case "F7" : vk = #VK_F7
Case "F8" : vk = #VK_F8
Case "F9" : vk = #VK_F9
Case "F10" : vk = #VK_F10
Case "F11" : vk = #VK_F11
Case "F12" : vk = #VK_F12
Case "ESCAPE" : vk = #VK_ESCAPE
Case "HOME" : vk = #VK_HOME
Case "INSERT" : vk = #VK_INSERT
Case "LEFT" : vk = #VK_LEFT
Case "PAGEDOWN" : vk = #VK_NEXT
Case "PAGEUP" : vk = #VK_PRIOR
Case "PRINTSCREEN" : vk = #VK_SNAPSHOT
Case "RETURN" : vk = #VK_RETURN
Case "RIGHT" : vk = #VK_RIGHT
Case "SHIFTDOWN" : shifted = #True : keybd_event(#VK_SHIFT, 0, 0, 0) ; Hold SHIFT down.
Case "SHIFTUP" : shifted = #False : keybd_event(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0) ; Release SHIFT.
Case "TAB" : vk = #VK_TAB
Case "UP" : vk = #VK_UP
EndSelect
If Left(s$, 3) <> "ALT" And Left(s$, 7) <> "CONTROL" And Left(s$, 5) <> "SHIFT"
keybd_event(vk, 0, 0, 0)
keybd_event(vk, 0, #KEYEVENTF_KEYUP, 0)
EndIf
r = r + s + 1 ; Continue getting the keystrokes that follow the special key.
Else
vk = VkKeyScanEx_(Asc(vk$), GetKeyboardLayout_(0)) ; Normal key found.
If vk > 304 And Not shifted ; Due to shifted character.
keybd_event(#VK_SHIFT, 0, 0, 0)
EndIf
keybd_event(vk, 0, 0, 0)
keybd_event(vk, 0, #KEYEVENTF_KEYUP, 0) ; Press the normal key.
If vk > 304 And Not shifted ; Due to shifted character.
keybd_event(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0)
EndIf
EndIf
Next
; Finished typing to target window!
If thread1 <> thread2
AttachThreadInput_(thread1, thread2, #False)
EndIf
keybd_event(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0) ; Release ALT key if user forgot.
keybd_event(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0) ; Release CONTROL key if user forgot.
keybd_event(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0) ; Release SHIFT key if user forgot.
Result = #True ; Report successful typing! :)
EndIf
ProcedureReturn Result
EndProcedure
Define m$, w$
m$= "This example types some text to Notepad, then clears and closes it."+Chr(13)
m$=m$+"Open a new Notepad window, then click the OK button and watch! :)"
MessageRequester("SendKeys example",m$,#MB_ICONINFORMATION)
;
RunProgram("notepad.exe", "", "", 0)
w$="Unbenannt - Editor" ; Specifies target window name.
Delay(1000) : SendKeys(0,w$,"This is a test!") ; Type some dummy text.
Delay(1000) : SendKeys(0,w$,"{CONTROLDOWN}f{CONTROLUP}")
Delay(1000) : SendKeys(0,"Suchen","{ENTER}") ; Select it all.