Leaderboard
Popular Content
Showing content with the highest reputation on 01/30/2015 in all areas
-
GuiBuilderNxt - Reboot [08/18/2016]
mLipok and 2 others reacted to jaberwacky for a topic
Thanks for the report! I'll try to find the source of the problem sometime in the pm. I lied. I wouldn't have been able to sleep! 1) fixed bug report per czardas.3 points -
As czardas tried to imply. As dumbfounded as you were when I said "line 38" and "3rd from the top"... Did you never stop to ask yourself... "How does he know that"? I don't know that, how could I? I have no idea what your issue truly is without seeing what code you're actually using and how you're using it. See... now you post your code and I can tell you.... It was line 32 that was actually your problem... Sleep stops your script for however many milliseconds are set between the parenthesis! Hey, but I was only 6 lines off for real! Edit: Here, no hard feelings. #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> HotKeySet("{ESC}", "_Exit") $TO = GUICreate("TO", 495, 378, -1, -1, -1, -1) $bstart = GUICtrlCreateButton("Start", 40, 330, 100, 30, -1, -1) $bstop = GUICtrlCreateButton("Stop", 160, 330, 100, 30, -1, -1) GUICtrlCreateLabel("Current Report:", 40, 40, 126, 30, -1, -1) GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, "-2") GUISetState(@SW_SHOW, $TO) AdlibRegister("Adlib", 10000) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $bstart Test() Case $bstop ExitLoop EndSwitch WEnd Func Adlib() MsgBox(0, "", "Test", 5000) ; msgbox will stop your script too! EndFunc ;==>Adlib Func Test() MsgBox(0, "Test", "Worked", 10000) Exit EndFunc ;==>Test Func _Exit() Exit EndFunc BTW, that code was a mess, and missing a function, and still has script stopping objects.2 points
-
It's about running exe from memory as it's often called. So you have some binary data that you want to embed in your script and run afterward like some additional program. In this post I will try to explain how to do it. First to deal with mentioned binary as that's, in spite of the plainness of retrieving it, often insuperable. To avoid questions about that this is one way of getting it: Global $sModule = "E:Program filesGUIDGenGUIDGEN.EXE" ; change to yours wanted Global $hModule = FileOpen($sModule, 16) If @error Then Exit Global $bBinary = FileRead($hModule) FileClose($hModule) Global Const $MAX_LINESIZE = 4095 Global $iNewLine, $j Global $iChinkSize = 32 Global $sBinary For $i = 1 To BinaryLen($bBinary) Step $iChinkSize $j += 1 If 4*($j * $iChinkSize) > $MAX_LINESIZE - 129 Then $iNewLine = 1 EndIf If $iNewLine Then $iNewLine = 0 $j = 0 $sBinary = StringTrimRight($sBinary, 5) $sBinary &= @CRLF & '$bBinary &= "' & StringTrimLeft(BinaryMid($bBinary, $i, $iChinkSize), 2) & '" & _' & @CRLF ContinueLoop EndIf If $i = 1 Then $sBinary &= '$bBinary = "' & BinaryMid($bBinary, $i, $iChinkSize) & '" & _' & @CRLF Else $sBinary &= ' "' & StringTrimLeft(BinaryMid($bBinary, $i, $iChinkSize), 2) & '" & _' & @CRLF EndIf Next $sBinary = StringTrimRight($sBinary, 5) ClipPut($sBinary) ConsoleWrite($sBinary)Now for what's really important... Executable file causes a computer to perform indicated tasks according to encoded instructions. Files that we talk about are in PE format. When exe file is run special loader reads it and performs act of loading. That's how that particular exe gets in touch with a processor. Processor then executes different actions described by the opcodes. Main requirement for any PE file required by the loader is for it to actually exist. To be written on the drive. It can't be in the air. That's not allowed and when you think of it it's only logical. So how to run from memory? I'm gonna fool the system. It will think that all works as it should and will have no idea that it plays my game. There is more than way of doing that. Method described here has been used by different peoples before. When doing research for this post I have encountered many implementations. And I must say that I was very disappointed seeing that even the writers of the code often lack understanding of it. It's kind of pathetic when you see some code used and when asking author what's this or that you get answer "I don't know". And if you ask for the code to be explained by words (any fucking human language) coders fail terribly. How can you write code if you can't explain it?!? Anyway, this is the procedure: Start your script Create new process using CreateProcess function with CREATE_SUSPENDED flag Use GetThreadContext function to fill CONTEXT structure Read and interpret passed binary Allocate enough memory for the new module inside the victim process Simulate loader. Construct the new module (load) in place of allocated space. Make use of mentioned CONTEXT structure. Change entry point data and ImageBaseAddress data. Resume execution If all that went well windows should now be running not the original module but the new, saved in script as a variable. The script: RunBinary.au3 Script is well commented so it shouldn't be too hard to get a grip. New script is taking all possible advantages of PE format. That means if your module (embedded) has relocation directory it will run for sure.If not it could fail. When it will fail? Modules with no reloc directory (IMAGE_DIRECTORY_ENTRY_BASERELOC) ought to be loaded at precise address (stored within module; IMAGE_OPTIONAL_HEADER ImageBase). If for some reason not enough space can be allocated at that address within victim's memory space, function will fail. Thing is system makes rules, if we are not allowed to some memory space of a process there is nothing to do then to try again. So, try again if it fails. Maybe change the 'victim'. edit: 64bit support added. That means you can embed either x64 or x86 modules. If your AutoIt is x64 you embed x64 modules. If AutoIt is x86 embed x86. x64 AutoIt could also use embedded x86 modules but I don't like that because needed structures would have to be changed to something that's not meeting aesthetics standards .1 point
-
SciTE Hopper : Jump to Any line by one click and many other helpfull functions ! As Ashalshaikh suggested me after leaving me the task to continue >SciTE Hopper, i open a new Topic about it. It will be more easy for futures updates. Many helpfull functions in contextual menu. SciTE Hopper is now multipurpose. • Color Catcher added • BinaryToAu3Kompressor added • TinyAu3Search replaced by StringFinder • RegJumper added • Edit With SciTE added (available in Options) • SpecialCharactersViewer added (available in Tray menu) New Contextual Menu : For a right Click on a function : • Copy function name • Insert a function header • Cut function • Copy function • Delete function • Create a variables List • Remove usseless Blank lines • Remove Debug lines ( all lines starting with ConsoleWrite or _ArrayDisplay ) • Set AutoIt Code Layout • Remove Comments For entire script : • Create a functions List • Create a variables List • Remove usseless Blank lines • Remove Debug lines ( all lines starting with ConsoleWrite or _ArrayDisplay ) • Set AutoIt Code Layout • Remove Comments • ( Open in SciTE a ) Duplicate of current Script in Temp Dir • ( Open in SciTE a ) Duplicate of current Script in Same Dir • Explore Parent Script Folder • Copy Script name • Copy Script path • Find Unused Functions • Find Unused Variables • Set all functions in alphabetic order.( func headers and regions ( in fact, all lines between functions ) are not supported.) SciTE Editor New Contextual Menu if SciTE Hopper is added ( in Options ) to SciTE Editor : when you made a selection in SciTE Editor you can : • Open a Reg Key in Regedit using RegJumper • Open a Url in your default Browser • Search on google in your default Browser • Search on AutoIt Website in your default Browser Now Can be added to windows start (minimized) Options are available by Tray Menu. A double click on tray icon will open clipboard content to SciTE Editor ( Handy when you have copied some code from your browser ) How to proceed for add SciTE Hopper to SciTE Editor : Run Scite Editor, run Scite Hopper ( compiled! ) go to Options and select Add/Remove to SciTE Tab. then click on Add button and it's done ! Right click on SciTE Editor and choose SciTE Hopper in Contextual Menu for run it when you need it ! Update of 07 Dec 2017 TinyAu3Search is replaced by StringFinder Previous downloads : 1287 Script and compiled version are available in the download section Thanks to Ashalshaikh, Melba23, Th3 MMA, Alzri2, taitel, Manadar, taz742, Yashield, Authenticity, Xenobiologist for their help and asdf8 for his >Includes Helper and azjio for his >FileSearch. Hope it help you and happy Scripting !1 point
-
One of the main issues AutoIt coder could have is lack of built-in data compression mechanism. Doing it "manually" is not an option because of the slowness of the interpretter. So, it's either using third party dlls (whatever) or some Windows API that exposes the funcionality. In this post I will compress data using well known GDI+. That's graphical library, so it's not straightforward approach. First I'm making BITMAP out of data and then convert that image into a PNG. PNG format includes form of compression, so at the end what's get is compressed data. Compression level is not very high compared to other methods, but considering everything - who cares . Of course that compressing string "ABC" will not make much sense and will result in, IDK 150 bytes of output because PNG includes metadata that take space, but for data in sizes of more than few KB you will see the difference. Besides you will see how your data looks if it's taken to be a picture. Script will create PNG out of itself called Test_Image.png and then read it and print to console: GDIP_Compress.au31 point
-
You're going to have us guess without your code and an example file of what you've tried aren't you ... ?1 point
-
1 point
-
Batch file wont be lunched
caramen reacted to abberration for a topic
Sorry, ShellExectue will not work for you then. Below is an example of how it can work. Note that you must use the full path of the script. If there are spaces in the path name, you will need to include quotes. Path without spaces: RunAs("MyLoginName", @ComputerName, "password", 1, @ComSpec & " /c start c:test.bat") Path with spaces: RunAs("MyLoginName", @ComputerName, "password", 1, @ComSpec & "/c start " & '"' & "c:Program Filestest.bat" & '"')1 point -
Quit my Gui and function
TheSaint reacted to MrAnderson for a topic
Thank you for your answer. I will test it and give you a replay.1 point -
I'm sure the api's are web based. I have never looked for them nor have I bothered validating. If you can find a dll based api, I'm sure it can be converted to be utilized quite easily with AutoIt. Other than that, if they're all web based, then you might have to look really hard at the winhttp.au3 udf.1 point
-
msg.exe note (Windows Vista and later): can send over network only on Professional / Business editions or higher level editions. other editions it can send message to local users only.1 point
-
I missed the EndFunc trying paste my answer faster than you.1 point
-
1 point
-
and another... ConsoleWrite((_IsFileEmpty(@scriptdir & '\test.txt') ) ? 'No' & @CRLF : 'Yes' & @CRLF) func _IsFileEmpty($file) return (stringregexp(fileread($file),'.')) ? 1 : 0 endfunc1 point
-
handyt2, One way to do it... ConsoleWrite((_IsFileEmpty(@scriptdir & '\test.txt') ) ? 'No' & @CRLF : 'Yes' & @CRLF) func _IsFileEmpty($file) return stringlen(stringreplace(fileread($file),@crlf,'')) endfunc kylomas1 point
-
Empty File, but may contain blank line(s)
handyt2 reacted to JLogan3o13 for a topic
How about a simple FileRead? $sFile = @DesktopDir & "\Test.txt" $sString = FileRead($sFile) MsgBox(0, "", ($sString = "") ? "File is empty." : "File contains data of some sort.")1 point -
PAExec...copy over a txt document and open it interactivly on the user session?1 point
-
Looking for a function
JohnOne reacted to jaberwacky for a topic
I thought _StringBetween did this already.1 point -
I just don't know where do you find this brain teasers JohnOne... my try to wrap my head around this one resulted in this, and i'm not even sure if its working correctly or how it preform, and is it even doing what it need to do, but it was a fun try and im off no sleep now... #include <Array.au3> $var = "aha [amy aa] zero [a strings a] hello [am to a] example[afinda]onea[aina]two[abracketsbracketa]afterbrackettt [aa]" ;~ $var = "[][my]zero[strings]hello[to]example[find]one[in]two[brackets]" ;~ $var = "aha [amy aa]" ;~ $var = "" $Array = _PosFrombetween($var, '[a', 'a]') ;~ $Array = _PosFrombetween($var, '[', ']') _ArrayDisplay($Array) Func _PosFrombetween($var, $start, $end) Local $verb = "(.*?)(\Q" & $start & "\E)(.*?)(\Q" & $end & "\E)";edited from some udf Local $arr = StringRegExp($var, $verb, 3) If Not IsArray($arr) Then Return SetError(1, 0, 0) _ArrayDisplay($arr, 'words');comment out this line if needed, it's here only for testing purpose Local $Array[(UBound($arr) / 4)][4] For $x = 2 To UBound($arr) - 1 Step 4 $Array[(($x + 2) / 4) - 1][0] = '"' & $arr[$x] & '"' Select Case $x <> 2 $Array[(($x + 2) / 4) - 1][1] = StringLen($arr[$x - 3]) + StringLen($arr[$x - 2]) + StringLen($arr[$x - 1]) + $Array[((($x + 2) / 4) - 1) - 1][3] Case Else $Array[(($x + 2) / 4) - 1][1] = StringLen($arr[$x - 2]) + StringLen($arr[$x - 1]) EndSelect $Array[(($x + 2) / 4) - 1][2] = StringLen($arr[$x]) $Array[(($x + 2) / 4) - 1][3] = $Array[(($x + 2) / 4) - 1][1] + $Array[(($x + 2) / 4) - 1][2] Next Return $Array EndFunc ;==>_PosFrombetween1 point
-
It looks good to me, well done! I ran Tidy and removed some duplicate variable declarations. These declarations would not have caused any real problems, but it's better. The recursion errors you encountered previously will not occur. I didn't see anything else wrong. Now you have to test it. ; #include <Date.au3> #include <MsgBoxConstants.au3> ; ========> Only need to declare the following three variables once. <======== Local $time = @HOUR Local $iTimeout = 10 Local $iFreeSpace = DriveSpaceFree("F:\") MsgBox($MB_SYSTEMMODAL, "Information", "Espace nécessaire: 130 000 MB" & @LF & "Espace libre: " & $iFreeSpace & " MB", $iTimeout) While 1 If $time = "02" Then If FileExists("F:\") Then Sleep(100) $iFreeSpace = DriveSpaceFree("F:\") ; Find the free disk space of the home drive, generally this is the C:\ drive. ;MsgBox($MB_SYSTEMMODAL, "Information", "Espace nécessaire: 130 000 MB" & @LF & "Espace libre: " & $iFreeSpace & " MB") If $iFreeSpace <= 130000 Then MsgBox($MB_SYSTEMMODAL, "Erreur", "L'espace disponible est insuffisant, veuillez insérer un autre disque et relancer le programme.") Exit EndIf Else MsgBox($MB_SYSTEMMODAL, 'Erreur', "Veuillez insérer le disque de Sauvegarde puis relancez le programme.") Exit EndIf $iTimeout = 10 MsgBox($MB_SYSTEMMODAL, 'Sauvegarde', "L'opération de Sauvegarde va débuter", $iTimeout) DirCopy("D:\Serveur\ARCHI GH-Serv\Dropbox\", "G:\Sauvegarde\", $FC_OVERWRITE + $FC_CREATEPATH) Sleep(72000000) Else If FileExists("F:\") Then Sleep(100) $iFreeSpace = DriveSpaceFree("F:\") ; Find the free disk space of the home drive, generally this is the C:\ drive. ;MsgBox($MB_SYSTEMMODAL, "Information", "Espace nécessaire: 130 000 MB" & @LF & "Espace libre: " & $iFreeSpace & " MB") If $iFreeSpace <= 130000 Then MsgBox($MB_SYSTEMMODAL, "Erreur", "L'espace disponible est insuffisant, veuillez insérer un autre disque (F:\) et relancer le programme.") Exit EndIf Else MsgBox($MB_SYSTEMMODAL, 'Erreur', "Veuillez insérer le disque de Sauvegarde puis relancez le programme.") Exit EndIf Sleep(3500000) EndIf WEnd ; Edit Actually I do see one more thing. Perhaps you need to add error handling after the 5th line. Something like: Local $iFreeSpace = DriveSpaceFree("F:\") If @Error Then MsgBox($MB_SYSTEMMODAL, "Information", "Drive F not found") Exit EndIf1 point
-
So your statement should be: Global Const $ppAlignLeft = 1 ; Left aligned $objPPT.ActivePresentation.Slides(1).Shapes(2).TextFrame.TextRange.ParagraphFormat.Alignment = $ppAlignLeft1 point
-
Here my idea: #include <Array.au3> ; 1234567890123456789012345678901234567890123456789012345678901234567890 $sText = "[#my#]zero[#strings#]hello[#to#]example[#find#]one[#in#]two[#brackets#]" $aResult = _StringGetPosEx($sText, "[#", "#]") _ArrayDisplay($aResult) Func _StringGetPosEx($sString, $sStart, $sEnd, $bCase = False) StringReplace($sString, $sStart, $sStart) Local $iStarts = @extended StringReplace($sString, $sEnd, $sEnd) Local $iEnds = @extended, $iLenL = StringLen($sStart), $iLenR = StringLen($sEnd) Local $aPosStarts[$iStarts], $aPosEnds[$iEnds], $i, $iMin $iMin = UBound($aPosStarts) < UBound($aPosEnds) ? UBound($aPosStarts) : UBound($aPosEnds) For $i = 0 To $iMin - 1 $aPosStarts[$i] = StringInStr($sString, $sStart, $bCase, $i + 1, 1) $aPosEnds[$i] = StringInStr($sString, $sEnd, $bCase, $i + 1, 1) Next Local $aResult[$iMin][3] For $i = 0 To UBound($aResult) - 1 $aResult[$i][0] = StringMid($sString, $aPosStarts[$i] + $iLenL, $aPosEnds[$i] - $aPosStarts[$i] - $iLenR) $aResult[$i][1] = $aPosStarts[$i] + $iLenL $aResult[$i][2] = $aPosEnds[$i] - 1 Next Return $aResult EndFunc Works for this particular simple example with the brackets, might not for other constellations (not tested). Br, UEZ1 point
-
Hmmz, if only this could be done somewhat reliably with occurances of capture groups in regex matches over a string instead of substrings between fixed delimiters... #include <Array.au3> ; 0 0 0 0 0 ; 123456789 123456789 123456789 123456789 123456789 $stringy = "I 1want to2 (this --> w <-- should not be counted," ; 1-50 $stringy = $stringy & " this --> 1 w 1 <-- should) know 3things4 about al" ; 51-100 $stringy = $stringy & "l 5strings67 beween digits8. This --> 12 <-- shoul" ; 101-150 $stringy = $stringy & "d lead to an empty string which cannot be indicate" ; 151-200 $stringy = $stringy & "d by a string position (it should lead to 0,0). 9 " ; 201-250 $stringy = $stringy & "This sentence should show up.10 This shouldn't...." ; 251-300 _ArrayDisplay(_stringRegExpWithPositions($stringy, "[0-9](.*?)[0-9]")) Exit Func _stringRegExpWithPositions($searchIn, $regex) ; remember the initial regex array and the count of found items; we'll need that later. If nothing found, just return False. $aFound = StringRegExp($searchIn, $regex, 3) $aFoundCount = UBound($aFound) If @error Then Return False Dim $result[0][3] ; We're going to work through the $searchIn, hunting the strings that matched the regex to find out their positions. $iIndex = 0 For $i In $aFound If $i == "" Then ; Can't indicate the position of an empty string in a string, since all positions in a string have a non-empty char. ; Add the element ("") to the array with positions 0,0 Local $newItem[1][3] = [["", 0, 0]] Else ; Ok, we got something of which we can find the position. Do ; We need to make sure that the regex-match that we found doesn't happen to occur earlier in the string too ; For instance, "x1x1" has one match for "[0-9](.*?)[0-9]". The captured group we want is on pos 3, but "x" is found at pos 1 too. ; To be safe, we compare whether the regex match actually changes when we cut out the current occurance of the substring. $iIndex = StringInStr($searchIn, $i, 0, 1, $iIndex + 1) $iLength = StringLen($i) $testString = StringLeft($searchIn, $iIndex - 1) & StringMid($searchIn, $iIndex + $iLength) Until Not _isArrayEqual(StringRegExp($searchIn, $regex, 3), StringRegExp($testString, $regex, 3)) ; Add the found substring and the starting and ending positions to our result array. Local $newItem[1][3] = [[$i, $iIndex, $iIndex + StringLen($i) - 1]] ; Local $newItem[1][3] = [[$i, $iIndex, StringLen($i)]] or, more insteresting to me personally, starting position and length... EndIf _ArrayAdd($result, $newItem) Next Return $result EndFunc ;==>_stringRegExpWithPositions Func _isArrayEqual($a1, $a2) ; compares only 1d arrays of the same size If Not IsArray($a1) Or Not IsArray($a2) Or UBound($a1) <> UBound($a2) Or UBound($a1, 2) <> 0 Then Return False For $i = 0 To UBound($a1) - 1 If $a1[$i] <> $a2[$i] Then Return False Next Return True EndFunc ;==>_isArrayEqual Pretty nifty if I do say so myself Turns out it even works pretty well for nested capture groups (like "[0-9]((.*?) .*?)[0-9]").1 point
-
a bit improved my performances... but still a liitle slower than your #include <Array.au3> $loops = 1000 $str = "The mad mad mad mad the mad cat on mad day in mad dog ate mad mad mad the mad cat on mad day in mad landThe mad mad mad mad the mad cat on mad day in mad dog ate mad mad mad the mad cat on mad day in mad landThe mad mad mad mad the mad cat on mad day in mad dog ate mad mad mad the mad cat on mad day in mad landThe mad mad mad mad the mad cat on mad day in mad dog ate mad mad mad the mad cat on mad day in mad land" $in = TimerInit() For $x = 1 To $loops $Array = _StringsInStr1($str, "mad");John Next $time = TimerDiff($in) ConsoleWrite($time & " John" & @CRLF) _ArrayDisplay($Array, $time) $in = TimerInit() For $x = 1 To $loops $Array = _StringsInStr2($str, "mad");bogQ Next $time = TimerDiff($in) ConsoleWrite($time & " bogQ" & @CRLF) _ArrayDisplay($Array, $time) $in = TimerInit() For $x = 1 To $loops $Array = _StringsInStr3($str, "mad");Chimp Next $time = TimerDiff($in) ConsoleWrite($time & " Chimp" & @CRLF) _ArrayDisplay($Array, $time) Func _StringsInStr1($SearchIn, $SearchFor) Local $Size = 10 Local $aPos[$Size], $Found = 0, $Index = 0 Do $Found = StringInStr($SearchIn, $SearchFor, 0, 1, $Found + 1) If $Found Then If $Index = $Size Then $Size += $Size ReDim $aPos[$Size] EndIf $aPos[$Index] = $Found $Index += 1 EndIf Until $Found = 0 Or @error If $Index = 0 Then Return SetError(1, 0, 0) EndIf ReDim $aPos[$Index] Return $aPos EndFunc ;==>_StringsInStr1 Func _StringsInStr2($SearchIn, $SearchFor) Local $aArray = StringSplit($SearchIn, $SearchFor, 1) If @error Then Return SetError(1, 0, 0) Local $sLen = StringLen($SearchFor) ReDim $aArray[$aArray[0]];remove last unneeded split $aArray[0] -= 1;Correct the number of returned values $aArray[1] = StringLen($aArray[1]) + 1;Calculate only first element with +1 coz other elements are calculated upon this element For $x = 2 To $aArray[0] $aArray[$x] = StringLen($aArray[$x]) + $aArray[$x - 1] + $sLen Next Return $aArray EndFunc ;==>_StringsInStr2 Func _StringsInStr3($SearchIn, $SearchFor) StringReplace($SearchIn, $SearchFor, $SearchFor) $iOccurrences = @extended If Not $iOccurrences Then Return SetError(1, 0, "") Local $iSearchLen = StringLen($SearchFor), $aPos[$iOccurrences + 1] = [1 - $iSearchLen] For $i = 1 To $iOccurrences $aPos[$i] = StringInStr($SearchIn, $SearchFor, 2, 1, $aPos[$i - 1] + $iSearchLen) Next $aPos[0] = $iOccurrences Return $aPos EndFunc ;==>_StringsInStr3 edit: little debug1 point
-
your function a bit semplified .... by using StringReplace($SearchIn, $SearchFor, $SearchFor) and then reading @extended, you know the nr. of occurrences of searched string... #include <Array.au3> $Array = _StringsInStr("The mad mad mad mad the mad cat on mad day in mad dog ate mad mad mad the mad cat on mad day in mad land", "mad") If Not IsArray($Array) Then Exit MsgBox(0, 0, 0) EndIf _ArrayDisplay($Array) Func _StringsInStr($SearchIn, $SearchFor) StringReplace($SearchIn, $SearchFor, $SearchFor) $iOccurrences = @extended If Not $iOccurrences Then Return SetError(1, 0, "") Local $aPos[$iOccurrences] For $i = 1 To $iOccurrences $aPos[$i - 1] = StringInStr($SearchIn, $SearchFor, 0, $i) Next Return $aPos EndFunc ;==>_StringsInStr1 point
-
Michiel, Why not create the GUI off-screen (use the @DeskTop* macros to get the visible display size) and then move it to the required position with WinMove once you have completed the "buildup". M231 point
-
asianqueen, Look at Adlib in the Help file. M231 point