Keystrokes to Windows
BlitzMax Forums/BlitzMax Programming/Keystrokes to Windows
| ||
| I was thinking today that I'd like to write a max program that automates some repditave tasks I have to do in windows. Does anybody know if its possible for me to send keystrokes to other apps from max. Example, send alt-tab to the system, then send a string of keystrokes, then a tab, another sting of keystrokes etc?? |
| ||
| Hi, I can't help with the solution, but I thought I'd drop you this link. http://www.autohotkey.com It's a superb free proggy Tom |
| ||
| here is a post where this was discussed somewhat: http://www.blitzmax.com/Community/posts.php?topic=48863 |
| ||
| Jay, I managed to get the AUTOIT dll to work with bmax. You need to download the free package (the dll is within the zipfile) from http://www.autoitscript.com/autoit3/downloads.php I have not completed doing all the AUTOIT functions but have completed several. Pls feel free to continue this work. The AUTOIT_Send function is what you need. The following is an example of what it can do
Strict
Include "incl_Autoit.bmx"
'You need to call AUTOIT_INIT() before using any of the AUTOIT functions
Local r=AutoIT_Init()
AUTOIT_ClipPut("This is text is in the Clipboard") 'Put text to clipboard
Local c$=AUTOIT_Clipget() 'Get text from clipboard
WinExec("Notepad.exe",1) 'runs notepad
AUTOIT_WinWaitActive("Untitled","",1000) 'Wait for Notepad window for 1000ms
AUTOIT_AutoItSetOption("SendKeyDelay", 10) ' Delay keypresses
AUTOIT_Send(c) 'send string to window
AUTOIT_Send("{ALTDOWN}{F4}{ALTUP}") 'send ALT-F4 to active window
'or AUTOIT_Send("!{F4})
End
The functions are described well in the help files. Note that the functions available from the dll are different from the Macro functions. The include file (which was going to be a mod - but I dont know when I will do this) is as per below |
| ||
| Thanks Guys, I installed autohotkey last night and it looks like what I need. I'll read up on Autoit now. Are there any websites I can go an shop around for useful little dll like this that free to distribute with my game? |
| ||
| Autoit does have a DLL that you can distribute free with commercial products. i confirmed that very thing today as i found it very interesting. |
| ||
| Hey assari this is really interesting, but I got the DLL and tried your code but blitz just crashes when compiling the example code. I changed the example code to this and bcc.exe still crashes and then blitz says "Build Error: failed to compile" Strict Include "incl_Autoit.bmx" End |
| ||
| Hi, It seems that the 1.16 compiler does not like the previous method I was using to declare the functions. I do not have time yet to go through and change everything but this code works for me. Try it out and see what happens. Do not forget to change the dll location Const AU_Default:Int=(-2147483647)
Extern "win32"
Function WinExec(lpCmdLine$z,nCmdShow:Int)
End Extern
Local path$="D:\assari\blitzmax\autoit-v3\AutoItX\" 'CHANGE THIS TO YOUR OWN LOCATION!!!
Global DLLHandle=loadlibraryA(path$+"AutoitX3.dll")
Global AutoIT_Init()"win32"=GetProcAddress(DLLHandle, "AU3_Init") 'Init(void);
Global AutoITX_ClipGet(szClip:Byte Ptr, nBufSize:Int)"win32"=GetProcAddress(DLLHandle, "AU3_ClipGet")
Function AUTOIT_ClipGet$(nBufSize:Int=255)
Local stuff:Byte[nBufSize]
AUTOITX_ClipGet(stuff,nBufSize)
Local ret$=string.FromCString(stuff)
Return ret$
End Function
Global AutoIT_ClipPut(szClip$z)"win32"=GetProcAddress(DLLHandle, "AU3_ClipPut") 'ClipPut(const char *szClip);
Global AutoIT_WinWaitActive(szTitle$z, szText$z, nTimeOut:Long)"win32"=GetProcAddress(DLLHandle, "AU3_WinWaitActive")
Global AutoIT_AutoItSetOption(szOption$z, nValue:Long)"win32"=GetProcAddress(DLLHandle, "AU3_AutoItSetOption")
Global AutoITX_Send(f$z, nmode:Long)"win32"=GetProcAddress(DLLHandle,"AU3_Send")
Function AUTOIT_Send(f:String, nmode:Long=0)
Return AUTOITX_Send(f,nmode)
End Function
Local r=AutoIT_Init()
AUTOIT_ClipPut("This text is in the Clipboard") 'Put text to clipboard
Local c$=AUTOIT_Clipget() 'Get text from clipboard
WinExec("Notepad.exe",1) 'runs notepad
AUTOIT_WinWaitActive("Untitled","",1000) 'Wait for Notepad window for 1000ms
AUTOIT_AutoItSetOption("SendKeyDelay", 10) ' Delay keypresses
AUTOIT_Send(c) 'send string to window
AUTOIT_Send("{ALTDOWN}{F4}{ALTUP}") 'send ALT-F4 to active window
'or AUTOIT_Send("!{F4})
End
|
| ||
This is awesome, thanks! But its messing with my variables. The for loop exits and go becomes some huge nember.
Strict
Const AU_Default:Int=(-2147483647)
Extern "win32"
Function WinExec(lpCmdLine$z,nCmdShow:Int)
End Extern
Local path$="c:\autoit-v3\AutoItX\" 'CHANGE THIS TO YOUR OWN LOCATION!!!
Global DLLHandle=loadlibraryA(path$+"AutoitX3.dll")
Global AutoIT_Init()"win32"=GetProcAddress(DLLHandle, "AU3_Init") 'Init(void);
Global AutoITX_ClipGet(szClip:Byte Ptr, nBufSize:Int)"win32"=GetProcAddress(DLLHandle, "AU3_ClipGet")
Function AUTOIT_ClipGet$(nBufSize:Int=255)
Local stuff:Byte[nBufSize]
AUTOITX_ClipGet(stuff,nBufSize)
Local ret$=string.FromCString(stuff)
Return ret$
End Function
Global AutoIT_ClipPut(szClip$z)"win32"=GetProcAddress(DLLHandle, "AU3_ClipPut") 'ClipPut(const char *szClip);
Global AutoIT_WinWaitActive(szTitle$z, szText$z, nTimeOut:Long)"win32"=GetProcAddress(DLLHandle, "AU3_WinWaitActive")
Global AutoIT_AutoItSetOption(szOption$z, nValue:Long)"win32"=GetProcAddress(DLLHandle, "AU3_AutoItSetOption")
Global AutoITX_Send(f$z, nmode:Long)"win32"=GetProcAddress(DLLHandle,"AU3_Send")
Function AUTOIT_Send(f:String, nmode:Long=0)
Return AUTOITX_Send(f,nmode)
End Function
Local r=AutoIT_Init()
Delay 1000
WinExec("Notepad.exe",1) 'runs notepad
AUTOIT_WinWaitActive("Untitled","",1000) 'Wait for Notepad window for 1000ms
AUTOIT_AutoItSetOption("SendKeyDelay", 20)
Local go
For go=1 To 5
Print "go="+go
AUTOIT_Send("asdf")
Next
Print "for loop exited"
Print "go="+go
End
|
| ||
| on my system go=6 on exit as expected. |
| ||
| okay it works fine with debug on. But with debug off... I don't get how it can change my variables. Here is a simpler example
Local r=AutoIT_Init()
Delay 1000
WinExec("Notepad.exe",1) 'runs notepad
AUTOIT_WinWaitActive("Untitled","",1000) 'Wait for Notepad window for 1000ms
Local go
Print "go="+go
AUTOIT_Send("a")
Print "go="+go
End
outputs: Building untitled3 Compiling:untitled3.bmx flat assembler version 1.64 3 passes, 4866 bytes. Linking:untitled3.exe Executing:untitled3.exe go=0 go=10688816 Process complete |
| ||
Yup, I'm getting the same error. works w debug on and error w/out. Floats works but not string, byte or intBuilding forum Compiling:forum.bmx flat assembler version 1.64 3 passes, 12257 bytes. Linking:forum.exe Executing:forum.exe go=0 go=2089893474 Process completeWinXP SP2 |
| ||
| hey, this is cool, I'm still using this stuff. The new blitzmax update makes it not work again. It doesn't like the $z Please fix it for me. You have to constantly maintain the code now that you made it! hahaha! |
| ||
| According to this thread http://www.blitzmax.com/Community/posts.php?topic=57496&hl=cstring this is a BlitzMax bug and will be fixed soon. |
| ||
| okay gotcha |