Key press or mouse clic simulation
Blitz3D Forums/Blitz3D Programming/Key press or mouse clic simulation
| ||
Hello, blitz friends, I need to create a routine that simulates the pressure of the "space" key or the left mouse keypress in a specific area of the screen; it seems that Blitz3D has commands to understand whether and how often you press a key, but no command to implement these features via software: can someone help me? Tnx GB |
| ||
Here's some Purebasic code for simulating keypresses. You can probably port it to Biltz3D easily enough. Note that identifiers that end with an underscore in PureBasic are Windows API commands. You'll need some of the Windows API decls files found at the links below to import the Windows API commands. Take a look in the User Libs code archives if the Windows API commands you need aren't in the files I linked below ( http://www.blitzbasic.com/codearcs/codearcs.php?cat=14 ). Windows management functions for message handling, timers, menus, and communications. http://www.blitzbasic.com/codearcs/codearcs.php?code=1179 Userlib 'kernel32.decls' decls file for 'Kernel32.dll' - http://www.blitzbasic.com/codearcs/codearcs.php?code=1180 Graphics Device Interface (GDI) functions for device output, such as those for drawing and font management. http://www.blitzbasic.com/codearcs/codearcs.php?code=1181 ; 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,window$,keys$) If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle. If IsWindow_(handle)=0 ; Does the target window actually exist? ProcedureReturn 0 ; Nope, so report 0 for failure to type. Else ; 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. Sleep_(125) ; 1/8 second pause before typing to prevent fast CPU problems. ; Now the actual typing starts. keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key before typing. keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key before typing. keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key before typing. keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key before typing. For r=1 To Len(keys$) vk=0 : 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 "DELAY" : vk=0 : Sleep_(1000) ; Delay typing for one second. Case "DELETE" : vk=#VK_DELETE Case "DOWN" : vk=#VK_DOWN Case "END" : vk=#VK_END Case "ENTER" : vk=#VK_RETURN Case "ESCAPE" : vk=#VK_ESCAPE 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 "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 "RIGHT" : vk=#VK_RIGHT Case "SCROLL" : vk=#VK_SCROLL Case "SPACE" : vk=#VK_SPACE Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down. Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT. Case "TAB" : vk=#VK_TAB Case "UP" : vk=#VK_UP Case "WINDOWS" : vk=#VK_LWIN EndSelect If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT" If vk<>0 keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key. EndIf EndIf r+s+1 ; Continue getting the keystrokes that follow the special key. Else vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found. If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character. keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key. If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character. EndIf Delay( 20 ) Next If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window! keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key in case user forgot. keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key in case user forgot. keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key in case user forgot. keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key in case user forgot. ProcedureReturn 1 ; Report successful typing! :) EndIf EndProcedure ; RunProgram("notepad.exe") ; Start Notepad... ; Repeat : Delay(100) : Until FindWindow_(0,"Untitled - Notepad")<>0 ; ...and wait for it to open. ; SendKeys(0,"Untitled - Notepad","Doesn't PureBasic kick serious butt! ;){ENTER}") |
| ||
Oh, Tnx Zethrax for your reply. To begin: Unfortunately I don't know the conversion sintax rules from PB to B3D; e.g. I think that "procedure" PB declaration is same of "function" in B3D, isn't it ? But "functions" in B3D require only a name, without parameters ... And then, I need a very small, essential program that simulate only a keystroke "space" or (better) a mouse left clic in a specific area of the screen when Window Session System Time value (in millisecs) matches an exact user value. I have already wrote the WSST query routine with common B3D commands, now I need the function in order that "when WSST value=myvalue then call mouse left clic function on screen specific area" ... An "indecent" proposal: would you be able to write this part of program in B3D language? Then if it works as expected I reward you via paypal (if you have an account) or through another system (WU, etc.): Are you agree? |
| ||
i once coded an win event recorder/replayer. Just in case, remind me. |