geasiki Posted January 24, 2009 Share Posted January 24, 2009 (edited) I was wondering if there was a better way to code this script I wrote so it uses less CPU or memory. I left a lot of the script out to shorten it ^^; expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> #include <Memory.au3> #include <NomadMemory.au3> #include <Array.au3> $Jump_chkbox = GUICtrlCreateCheckbox("JUMP", 7, 71, 97, 17) GUICtrlSetOnEvent(-1, "_JumpHack") While 1 ;main loop WEnd Func _JumpHack() While BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED) ; wondering why 'if' doesn't work $Title = "Element Client" $Base_Address = 0x009398ec Global $OffSet_Jump[3] $OffSet_Jump[1] = 32 $OffSet_Jump[2] = 2844 Global $ProcessID = WinGetProcess($Title) Global $OpenMemory = _MemoryOpen($ProcessID) $Jump = _MemoryPointerRead($Base_Address, $OpenMemory, $OffSet_Jump) _MemoryPointerWrite($Base_Address, $OpenMemory, $OffSet_Jump, 1) ; pointer value to 1 _MemoryClose($OpenMemory) WEnd if BitAND(GUICtrlRead($Jump_chkbox), $GUI_UNCHECKED) Then _MemoryClose($OpenMemory) ; disables hack EndIf EndFunc Edited January 24, 2009 by geasiki Link to comment Share on other sites More sharing options...
Authenticity Posted January 24, 2009 Share Posted January 24, 2009 I did a brief reading but I came up with several notes. - This While 1...WEnd loop should call Sleep(150) or so. - I don't see any Opt('GuiOnEventMode', 1) in the code but I think it's typo - Make a flag variable to store the check box state in the beginning of the routine to avoid calling GuiCtrlRead over and over. - Try not to use BitAND, in my opinion it's just to make the code more readable but it involves function call. - Why declaring a global variable withing function that get could again and again? - Perhaps the If BitAND(GuiCtrlRead($Jump_chkbox), $GUI_CHECKED)) didn't work because you forgot to add Then? may be some other cases but this is what I came with so far. Link to comment Share on other sites More sharing options...
geasiki Posted January 24, 2009 Author Share Posted January 24, 2009 @Authenticity, thank you for the quick reply^^ - This While 1...WEnd loop should call Sleep(150) or so.I added sleep(1000) which helped reduce the fan on my laptop - I don't see any Opt('GuiOnEventMode', 1) in the code but I think it's typoI didn't add it on the above script but this is the reason I have it... If I don't need it please tell me $Button = GUICtrlCreateButton("change", 255, 39, 41, 81, 0) GUICtrlSetOnEvent(-1, "_NameChange") Func _NameChange() $old = GUICtrlRead($Input1) $new = GUICtrlRead($Input2) $wgt = wingettitle($old) winsettitle($old,"",$new) EndFuncoÝ÷ Ú«¨µãæ¨/j¸nW¢ËhëayÈ^rFèÆËZµè§¶z§)à¡ûazº.¶)Þ¶¯¢'jYb®+kvÞ©Ý¢÷«þ«¨µà*.+Þæ§{¦¦W¨~0Û!¢é]mçhæ§w^â,¥v)Üç^Ò!j÷¹rº1zÌ"¶")Zû§rبʮ¢×¯)è¶Ú.±àb´Cy²¢§â·lë-¶ëayÊzj+z·u¦åy»Ø§¾ozÇîËb¢w_êº^:G²¶$Ú~«¨µãÞ®©²Ø^!ðb´C趹Qy§tߢn!º1Ó~P" ØmÂämçºÇ²¢çè® -¶u8^ú®¢×v'ZuÝýN§ßÖî¶+l¶)ev'gßÛp¢¹¢é]ÖÞ¶¶·÷bíý穲Ø^½©nzÚÖéíXßÛ.È^rGÂ¥zØ^ßØßØî²×!jx²Ø^½©nzÜy©ÝضÊ/z¼+Û^«¨µå¡Éתâ Úö«¦å{)à~éܶ*'¶ë¢é]j¢©Ýj¢ú®¢×²¢éjybëaÆ®¶sdgVæ2ô§V×6² vÆRuT7G&Å&VBb33c´§V×ö6¶&÷Òb33c´uTô4T4´T@ Æö6Âb33c´öfe6WEô§V׳5Ð b33c´öfe6WEô§V׳ÒÒ3 b33c´öfe6WEô§V׳%ÒÒ#C@ b33c´÷VäÖVÖ÷'ÒôÖVÖ÷'÷Vâb33cµ&ö6W74B b33c´§V×ÒôÖVÖ÷'öçFW%&VBb33c´&6UôFG&W72Âb33c´÷VäÖVÖ÷'Âb33c´öfe6WEô§V× ôÖVÖ÷'öçFW%w&FRb33c´&6UôFG&W72Âb33c´÷VäÖVÖ÷'Âb33c´öfe6WEô§V× ôÖVÖ÷'6Æ÷6Rb33c´÷VäÖVÖ÷' tVæ@ buT7G&Å&VBb33c´§V×ö6¶&÷Òb33c´uTõTä4T4´TBFVà ¶6öÆ÷#ÒgV÷C²4dddcgV÷CµÒb33c´÷VäÖVÖ÷'ÒôÖVÖ÷'÷Vâb33cµ&ö6W74B²ö6öÆ÷%ТôÖVÖ÷'6Æ÷6Rb33c´÷VäÖVÖ÷' VæD`¤VæDgVæ I don't know why, but if I take the 'global' off and I don't rewrite it here(yellow) I get an error when I uncheck the box. (Error: Variable used without being declared.) Link to comment Share on other sites More sharing options...
jaberwacky Posted January 24, 2009 Share Posted January 24, 2009 (edited) if GUICtrlRead($Jump_chkbox)= $GUI_UNCHECKED Then $OpenMemory = _MemoryOpen($ProcessID) _MemoryClose($OpenMemory) EndIf What is this? Why open memory and then immeidiately close memory? And about Global what authtenticity meant was to declare your variables outside of the function so that you aren't constantly declaring variables and then killing them at the end of the function call. Edited January 24, 2009 by jaberwocky6669 Helpful Posts and Websites: AutoIt3 Variables and Function Parameters MHz | AutoIt Wiki | Using the GUIToolTip UDF BrewManNH | Can't find what you're looking for on the Forum? Link to comment Share on other sites More sharing options...
BrettF Posted January 24, 2009 Share Posted January 24, 2009 (edited) Try: expandcollapse popup;Include necessary include files #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> #include <Memory.au3> #include <NomadMemory.au3> #include <Array.au3> ;Declare constants Global $OffSet_Jump[3] $OffSet_Jump[1] = 32 $OffSet_Jump[2] = 2844 Global $ProcessID = WinGetProcess($Title) Global $OpenMemory = _MemoryOpen($ProcessID) ;Create GUI ETC $Jump_chkbox = GUICtrlCreateCheckbox("JUMP", 7, 71, 97, 17) GUICtrlSetOnEvent(-1, "_JumpHack") ;main loop While 1 ;Small sleep to conserve CPU Sleep(10) WEnd ;Jump Hack function... Func _JumpHack() Local $Base_Address = 0x009398ec Local $Title = "Element Client" If BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED) Then; wondering why 'if' doesn't work $Jump = _MemoryPointerRead($Base_Address, $OpenMemory, $OffSet_Jump) _MemoryPointerWrite($Base_Address, $OpenMemory, $OffSet_Jump, 1); pointer value to 1 Else ;Do the opposite of disabling? ;Maybe? $Jump = _MemoryPointerRead($Base_Address, $OpenMemory, $OffSet_Jump) _MemoryPointerWrite($Base_Address, $OpenMemory, $OffSet_Jump, 0); pointer value to 1 EndIf EndFunc ;==>_JumpHack ;ON EXIT FUNC Func OnAutoITExit() ;Close memory If IsDeclared("OpenMemory") Then _MemoryClose($OpenMemory) EndFunc ;==>OnAutoITExit Cheers, Brett EDIT: Use BitAnd as several states can be returned by GUICtrlRead for the checkbox (includes $GUI_FOCUS and $GUI_CHECKED). Opt('GuiOnEventMode', 1) is required for your script to run in OnEvent mode. A large sleep is not necessary. To retain a responsive GUI keep it between 10-50ms. 1000ms is one second remember. Edited January 24, 2009 by BrettF Vist my blog!UDFs: Opens The Default Mail Client | _LoginBox | Convert Reg to AU3 | BASS.au3 (BASS.dll) (Includes various BASS Libraries) | MultiLang.au3 (Multi-Language GUIs!)Example Scripts: Computer Info Telnet Server | "Secure" HTTP Server (Based on Manadar's Server)Software: AAMP- Advanced AutoIt Media Player | WorldCam | AYTU - Youtube Uploader Tutorials: Learning to Script with AutoIt V3Projects (Hardware + AutoIt): ArduinoUseful Links: AutoIt 1-2-3 | The AutoIt Downloads Section: | SciTE4AutoIt3 Full Version! Link to comment Share on other sites More sharing options...
Authenticity Posted January 24, 2009 Share Posted January 24, 2009 I added sleep(1000) which helped reduce the fan on my laptop Yes it would reduce the cpu load but your thread is suspended for a second that in the mean of computers time it's like few thousands INC EAX ^^.Try to keep it around 100-300 ms to get quicker interaction with the user.I don't know why, but if I take the 'global' off and I don't rewrite it here(yellow) I get an error when I uncheck the box. (Error: Variable used without being declared.)Sorry, it was a brief reading so maybe I made a mistake. Anyway if you want to reference this variable outside the function it should be declared with global scope in the header declarations section.As for the While "GUICtrlRead($Jump_chkbox) = $GUI_CHECKED" I still don't get the point if it's on event it will get called upon request for event but if you prefer it this way so indeed GuiCtrlRead is required, unless you can enlighten my eyes.Good-Luck Link to comment Share on other sites More sharing options...
geasiki Posted January 24, 2009 Author Share Posted January 24, 2009 Thank you Authenticity, jaberwocky6669, and BrettF for all the help As for the While "GUICtrlRead($Jump_chkbox) = $GUI_CHECKED" I still don't get the point if it's on event it will get called upon request for event - I'm new to Autoit and it's probably my english, but can you please rewrite it? I'm going to work on the 'flag' part tomorrow so I can avoid calling GuiCtrlRead over and over... Not sure where to start Still not sure why the 'While BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED)' or the 'While GUICtrlRead($Jump_chkbox) = $GUI_CHECKED' doesn't work with an 'If ... then' The only thought that comes to mind is that the 'while' keeps the value to a 1 until it's unchecked while the 'if' just changes the value once and it gets overwritten by the client. Anyway going to sleep, g'night everyone Link to comment Share on other sites More sharing options...
BrettF Posted January 24, 2009 Share Posted January 24, 2009 Try this reproducer. All working here: expandcollapse popup;Include necessary include files #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> #include <Memory.au3> ;#include <NomadMemory.au3> #include <Array.au3> ;Declare constants and options. Opt("GUIOnEventMode", 1) ;Global $OffSet_Jump[3] ;$OffSet_Jump[1] = 32 ;$OffSet_Jump[2] = 2844 ;Global $ProcessID = WinGetProcess($Title) ;Global $OpenMemory = _MemoryOpen($ProcessID) ;Create GUI ETC $GUI = GUICreate("", 800, 600) GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents") $Jump_chkbox = GUICtrlCreateCheckbox("JUMP", 7, 71, 97, 17) GUICtrlSetOnEvent(-1, "_JumpHack") GUISetState() ;main loop While 1 ;Small sleep to conserve CPU Sleep(10) WEnd Func SpecialEvents() Select Case @GUI_CtrlId = $GUI_EVENT_CLOSE ;MsgBox(0, "Close Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Exit Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE MsgBox(0, "Window Minimized", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Case @GUI_CtrlId = $GUI_EVENT_RESTORE MsgBox(0, "Window Restored", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) EndSelect EndFunc ;==>SpecialEvents ;Jump Hack function... Func _JumpHack() MsgBox(0, "", "Jump Hack Function Called!") MsgBox(0, "State", BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED)) ; Local $Base_Address = 0x009398ec ;Local $Title = "Element Client" If BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED) Then; wondering why 'if' doesn't work MsgBox(0, "Selected", "true") ;$Jump = _MemoryPointerRead($Base_Address, $OpenMemory, $OffSet_Jump) ;_MemoryPointerWrite($Base_Address, $OpenMemory, $OffSet_Jump, 1); pointer value to 1 Else MsgBox(0, "Selected", "False") ;Do the opposite of disabling? ;Maybe? ;$Jump = _MemoryPointerRead($Base_Address, $OpenMemory, $OffSet_Jump) ;_MemoryPointerWrite($Base_Address, $OpenMemory, $OffSet_Jump, 0); pointer value to 1 EndIf EndFunc ;==>_JumpHack ;ON EXIT FUNC Func OnAutoITExit() ;Close memory ;If IsDeclared("OpenMemory") Then _MemoryClose($OpenMemory) EndFunc ;==>OnAutoITExit If it still doesn't work, attach your whole script and we'll try find the problem Brett Vist my blog!UDFs: Opens The Default Mail Client | _LoginBox | Convert Reg to AU3 | BASS.au3 (BASS.dll) (Includes various BASS Libraries) | MultiLang.au3 (Multi-Language GUIs!)Example Scripts: Computer Info Telnet Server | "Secure" HTTP Server (Based on Manadar's Server)Software: AAMP- Advanced AutoIt Media Player | WorldCam | AYTU - Youtube Uploader Tutorials: Learning to Script with AutoIt V3Projects (Hardware + AutoIt): ArduinoUseful Links: AutoIt 1-2-3 | The AutoIt Downloads Section: | SciTE4AutoIt3 Full Version! Link to comment Share on other sites More sharing options...
Authenticity Posted January 24, 2009 Share Posted January 24, 2009 As for the While "GUICtrlRead($Jump_chkbox) = $GUI_CHECKED" I still don't get the point if it's on event it will get called upon request for eventStill not sure why the 'While BitAND(GUICtrlRead($Jump_chkbox), $GUI_CHECKED)'or the 'While GUICtrlRead($Jump_chkbox) = $GUI_CHECKED' doesn't work with an 'If ... then'The only thought that comes to mind is that the 'while' keeps the value to a 1 until it's unchecked while the 'if' just changes the value once and it gets overwritten by the client. I think it's the question of the purpose of your script and what it should achieve so If...Then...EndIf won't work if you intend to process a While...WEnd loop but keep in mind that you don't need to set on event for this control as you keep checking the control's state so just make it a simple function and call it before the sleep loop. It's your decision what your script should achieve.Anyway going to sleep, g'night everyone Night ;] Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now