Mbee Posted August 11, 2019 Share Posted August 11, 2019 (edited) I'm working on a script which runs and interacts with VLC, which is going fine except for a peculiar behavior by VLC: If it failed to play the previous video (it wouldn't start or play for some reason), the next time you try to play any video, it throws up a stupid popup telling you that the previous video failed (instead of just playing the new video). Aargh! Since this is an unpredictable situation (for example, the user may have launched a video manually, outside my script), the best I can come up with to find a way to detect this is to save a WinList("VLC") (or _WinAPI_EnumWindowsTop() ) before launching and then save a second list right afterwards, then look for a difference between the two, 2 dimensional arrays, which in most cases will have different sizes but will always be unsorted. (Of course, if there were some other way of detecting a new window, such as a Windows message or the like, I'd want to explore that. But I know of no such alternative). Another possibility would be to save two _WinAPI_EnumWindowsPopup() and look for only pop-up windows, but the disadvantage of that is that I need to get the handle of the new window in case it is not a pop-up. But once I have the lists, which will rarely contain more than 300 elements (if I use WinList()), what's a good algorithm to detect the different element(s)? I've read a number of threads here regarding detecting the difference between two arrays, but none really seem to be directly on point due to a reliance on the two arrays having the same size, or the arrays must be sorted first. I'm quite intrigued by the scripting dictionary concept, but although creating and populating two dictionaries looks straightforward, I haven't been able to locate an example of detecting the difference between two dictionaries. Have I missed one? I also don't know if using dictionaries would be desirable for two arrays with no more than ~300 elements (or less). Would you kindly recommend an appropriate example, even if just in pseudo-code? Or should I just sort both arrays first, making detecting a difference easy? Thank you for your time! Edited August 11, 2019 by Mbee Link to comment Share on other sites More sharing options...
FrancescoDiMuro Posted August 11, 2019 Share Posted August 11, 2019 @Mbee Always appreciated your elegant through which you explain yourself. In this case, if that error popup is not so important, then you could try an easiest way to hide/to not show that, and that way is explained here Mbee 1 Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette Link to comment Share on other sites More sharing options...
Mbee Posted August 11, 2019 Author Share Posted August 11, 2019 39 minutes ago, FrancescoDiMuro said: @Mbee Always appreciated your elegant through which you explain yourself. In this case, if that error popup is not so important, then you could try an easiest way to hide/to not show that, and that way is explained here Thank you most kindly, @FrancescoDiMuro. That's the nicest thing anyone's ever said to me here! Apparently, I tend to annoy the folks around these parts, certainly without intending to... @Melba23 gives age as a (totally unnecessary) "excuse", but I'm in my 70's and have been away from programming for a very long time before discovering this incredibly great language... The link you provided is great and quite on point (I haven't test it yet). I half-expected at some point to need to go in and potentially alter VLC's preferences (such as the vlcrc file), instead of asking the user to manually change them, as may be necessary to ignore those unimportant error reports. I'd save them before hand and restore any changes on exit. Please accept my highest thanks for your response! Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 Alas, VLC does not consider the "sorry I screwed up last time" popup to be an "unimportant" error. Turning that off didn't prevent the popup from showing up. Bummer... So I'm stuck with alternative solutions. At least I can narrow down the window list by specifying the string "VLC" as the title in the WinList function call. I've also confirmed that the error window is actually a popup, with some known, visible text. Also, since I can find the specific video window just launched (assuming I didn't get the weird error popup) by specifying the file path as the title (converting it to URL format in accordance with the $F title preference I have to ensure is set -- I can unpack that if anyone wishes), If I don't see the pop-up, I can stop looking and find the correctly playing video win handle readily enough. I'm now hoping that that kind of stupid pop-up is sufficiently rare that I don't have to worry about finding the difference between before and after saved lists, but if anyone feels like taking on my OP as an exercise, I'd be fascinated to see some suggestions... Thanks Link to comment Share on other sites More sharing options...
FrancescoDiMuro Posted August 12, 2019 Share Posted August 12, 2019 @Mbee Well, then we need more information about the Window which appears, and, if you can, a script we run, and how to reproduce the error you are getting. There could be another way out, but let's dig one thing at time Mbee 1 Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 (edited) 10 hours ago, FrancescoDiMuro said: @Mbee Well, then we need more information about the Window which appears, and, if you can, a script we run, and how to reproduce the error you are getting. There could be another way out, but let's dig one thing at time Thanks for sticking with me, Francesco! The following won't actually run because there's a lot of preliminary setup work that's too long to post, but this is the actual code I'm using with no modifications.... expandcollapse popupFunc _LaunchVid( $arg_Path ) Local $Lf_Stat, $Lf_VidName, $Lf_PID, $Lf_WinHdl, $Lf_LocalInfoAra[$Gc_NumVidListCols] Local $Lf_VidPath, $Lf_Drv, $Lf_Dir, $Lf_FileName, $Lf_ExtWithDot, $Lf_VLCPath Local $Lf_launchSuccess, $Lf_CloseDone, $Lf_CloseWaitCount $Lf_VLCPath = "" If $G_VLCExePath = "" Then $Lf_VLCPath = RegRead( $Gc_RegRoot, $Gc_VLCexeRegValName ) If @error <> 0 Then $Lf_VLCPath = "" EndIf If $Lf_VLCPath = "" Then _ChooseVLC() ; Create and show a GUI asking for VLC exe path EndIf EndIf $Lf_launchSuccess = True Do Local $Lf_PrePopupList = _GetVLCFailPopups() If IsArray($Lf_PrePopupList) = 0 Then MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PrePopupList is NOT AN ARRAY!") Exit EndIf $Lf_VidPath = '"' & $arg_Path & '"' $Lf_PID = ShellExecute( $G_VLCExePath, $Lf_VidPath, $SHEX_OPEN ) If @error <> 0 Then _ShowMsg("INTERNAL ERROR: Unable to launch VLC to play video") Beep( 1000, 500 ) _WinAPI_FlashWindowEx( $G_VidToolGUI, 3, 2 ) Return -1 EndIf Local $Lf_PostPopupList = _GetVLCFailPopups() If IsArray($Lf_PostPopupList) = 0 Then MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PostPopupList is NOT AN ARRAY!") Exit EndIf Local $Lf_PostAraSize = UBound($Lf_PostPopupList) ; = 64 If $Lf_PostPopupList[0] > 0 Then ; KABOOM! Index out of range? Local $Lf_DiffPopupList = _PopupListDiff( $Lf_PrePopupList, $Lf_PostPopupList ) If $Lf_DiffPopupList[0] > 0 Then $Lf_launchSuccess = False For $i = 1 To $Lf_DiffPopupList[0] WinClose( $Lf_DiffPopupList[$i] ) $Lf_CloseDone = False $Lf_CloseWaitCount = 0 Do If WinExists( $Lf_DiffPopupList[$i] ) = 0 Then $Lf_CloseDone = True Else Sleep( 1000 ) $Lf_CloseWaitCount += 1 EndIf Until $Lf_CloseDone Or ($Lf_CloseWaitCount > 10) Next EndIf EndIf Until $Lf_launchSuccess Return $Lf_PID EndFunc ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Func _PopupListDiff( $arg_WinList1, $arg_WinList2 ) Local $Lf_DiffAra[1] = [ 0 ] Local $Lf_WinList1Size = $arg_WinList1[0] Local $Lf_WinList2Size = $arg_WinList2[0] Local $Lf_DiffAraSize = 1 If $Lf_WinList1Size > 1 Then Local $Lf_SortedWinList1 = _ArraySort( $arg_WinList1, 0, 1 ) Else If $Lf_WinList1Size = 0 Then Return $arg_WinList2 EndIf Local $Lf_SortedWinList1[1] $Lf_SortedWinList1[0] = 1 $Lf_SortedWinList1[1] = $arg_WinList1[1] EndIf If $Lf_WinList2Size > 1 Then Local $Lf_SortedWinList2 = _ArraySort( $arg_WinList1, 0, 1 ) Else Return $arg_WinList2 EndIf For $i = 1 To $Lf_WinList2Size If $i < $Lf_WinList1Size Then If StringUpper($Lf_SortedWinList1[$i]) <> StringUpper($Lf_SortedWinList2[$i]) Then ReDim $Lf_DiffAra[$Lf_DiffAraSize +1] $Lf_DiffAra[$Lf_DiffAraSize] = $Lf_SortedWinList2[$i] $Lf_DiffAra[0] += 1 $Lf_DiffAraSize += 1 EndIf Else ReDim $Lf_DiffAra[$Lf_DiffAraSize +1] $Lf_DiffAra[$Lf_DiffAraSize] = $Lf_SortedWinList2[$i] $Lf_DiffAra[0] += 1 $Lf_DiffAraSize += 1 EndIf Next Return $Lf_DiffAra EndFunc ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Func _GetVLCFailPopups() Const $Lfc_SearchString = "VLC Media Player Portable did not close properly last time it was run and will now clean up." Local $Lf_FoundAra[1] = [ 0 ], $Lf_FoundIndex = 1 Local $Lf_WinText Local $Lf_PopupAra = _WinAPI_EnumWindowsPopup() Local $Lf_NumPops = $Lf_PopupAra[0][0] If $Lf_NumPops = 0 Then Return $Lf_PopupAra EndIf For $i = 1 To $Lf_NumPops $Lf_WinText = WinGetText( $Lf_PopupAra[$i][0], $Lfc_SearchString ) If $Lf_WinText <> "" Then If StringInStr( $Lf_WinText, $Lfc_SearchString, $STR_NOCASESENSEBASIC ) > 0 Then ReDim $Lf_FoundAra[$Lf_FoundIndex +1] $Lf_FoundAra[$Lf_FoundIndex] = $Lf_PopupAra[$i][0] $Lf_FoundAra[0] += 1 $Lf_FoundIndex += 1 EndIf EndIf Next Return $Lf_FoundAra EndFunc But something weird is going on: At line 46 ("If $Lf_PostPopupList[0] > 0 Then"), I constantly get an "index out of range" error (image posted below). As you can see, I've put in tests to make sure I'm returning an actual array type, and the UBound of PostPopupList = 46, so what the heck is going wrong? I need a second set of eyes, please. Once I get past that issue, I think these algorithms will do what I want, but even so, this might not be the best way to go. Oh, and my naming conventions don't match the AutoIt standard (not that there's anything wrong with that standard), it's just that I like to know the scope of variables as well. So $Lf_ represents a variable that's Local to the specific Function it appears in. Thanks for lending a hand! Edited August 12, 2019 by Mbee Typos Link to comment Share on other sites More sharing options...
iamtheky Posted August 12, 2019 Share Posted August 12, 2019 isnt hiding these errors inside VLC also an option, rather than accomodating the behavior via brute force? Does this parameter kill those warnings? vlc.exe --no-qt-error-dialogs Mbee 1 ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__) Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 24 minutes ago, iamtheky said: isnt hiding these errors inside VLC also an option, rather than accomodating the behavior via brute force? Does this parameter kill those warnings? vlc.exe --no-qt-error-dialogs Thanks, I'll try it and report back.. Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 (edited) So far, so good! Thanks a bunch, @iamtheky ! Employing both techniques has worked so far -- hooray! Of course, if the user launches a video independently, all bets are off. But I have reduced the probability of someone doing that by setting things up such that she/he can simply drop a video on my GUI, whereupon I'll launch it with the "--no-qt-error-dialogs' option. I'll wait to call this Solved until I do some more testing, but I'm extremely happy with the valuable assistance you both have kindly provided me! By the way, I discovered yet another annoying popup that can show up: " Another instance of VLC Media Player is already running. Please close other instances of VLC Media Player before launching VLC Media Player". Happily, the option passed along by iamthekey appears to eliminate this one, too! I have another problem related to VLC in this app: The weird encoding of file paths or filenames that VLC puts in the titles of the videos I launch, particularly if unicode/wide characters occur in them. You see, it's absolutely necessary that I be able to identify the window in which the video is being played, and the easiest way to do that is, first, to tell VLC to use the full path in the title bar. Then I use a WinWait() call, specifying the path that I launched. But if the path includes spaces (as is almost always the case), instead of using URL encoding and encoding those spaces as "%20", VLC replaces them with plus signs. Okay, I can easily handle that for non-wide, ASCII characters. But if the path includes wide, Unicode characters, VLC appears to use URL encoding (I'm not certain of this, but I think so). Thus, it's a weird hybrid encoding that I don't know how to reproduce, since I don't know how to distinguish wide characters that need to be URL encoded versus those which do not. Any tips? I've posted a question asking about this strange encodeing at the Windows Troubleshooting sub-forum at VideoLAN.org, but have not received an answer yet... Edited August 12, 2019 by Mbee Added another problem that @iamthekey's suggestion solved Link to comment Share on other sites More sharing options...
iamtheky Posted August 12, 2019 Share Posted August 12, 2019 do they fire with the 8.3 name? (filegetshortname) ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__) Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 Well, I need to specify the full path, since there can easily be two different videos with the same name but in different paths. I see that all the time with downloaded videos... Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 Well, I'm very confused, since I definitely saw plus signs instead of %20 s, but now they're all %20s again! Here's a fragment that I got from inside the graphical debugger: "%3F+No%2C+You+Shut+Up%21+-+Evolution+vs+Intelligent+Design+-+YouTube.mp4" But now it's: "%E2%96%B6%20No%2C%20You%20Shut%20Up%21%20-%20Evolution%20vs%20Intelligent%20Design%20-%20YouTube.mp4 - VLC media player" Well, I'll use full URL encoding unless that ends up not working either... Link to comment Share on other sites More sharing options...
Mbee Posted August 12, 2019 Author Share Posted August 12, 2019 (edited) DAMMIT! The --no-qt-error-dialogs ... option doesn't work after all. I keep getting both of the error pop-ups described earlier: "did not close properly last time it was run and will now clean up." - and - " Another instance of VLC Media Player is already running. Please close other instances of VLC Media Player before launching VLC Media Player" I was extremely hopeful that option would be sufficient, but VLC's developers had/have some strange ideas about error reporting. The second pop-up is far stupider than the first, since I've always set the preferences to allow multiple instances and I've actually launched up to about 20 instances at times for decades now. Back to my OP, I'm afraid. Edited August 12, 2019 by Mbee Link to comment Share on other sites More sharing options...
junkew Posted August 12, 2019 Share Posted August 12, 2019 expandcollapse popupLocal $oDict1 = ObjCreate("Scripting.Dictionary") Local $oDict2 = ObjCreate("Scripting.Dictionary") $odict1.add("B","Value b") $odict1.add("C","Value c") $odict1.add("D","Value d") $odict1.add("E","Value e") $odict2.add("A","Value a") $odict2.add("B","Value b") $odict2.add("C","Value c") $odict2.add("E","Value e") $odict2.add("F","Value f") $diff=compDic($oDict1,$oDict2) for $i=0 to $diff.count-1 consolewrite($diff.keys[$i]) Next consolewrite(@CRLF) $diff=compDic($oDict2,$oDict1) for $i=0 to $diff.count-1 consolewrite($diff.keys[$i]) Next func compDic($d1,$d2) Local $oDiff = ObjCreate("Scripting.Dictionary") for $i=0 to $d1.count-1 if $d2.exists($d1.keys[$i]) Then ;~ consolewrite($d1.keys[$i]) else $oDiff.add($d1.keys[$i], $d1.items[$i]) EndIf Next return $oDiff endfunc Mbee 1 FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets Link to comment Share on other sites More sharing options...
Mbee Posted August 13, 2019 Author Share Posted August 13, 2019 (edited) Thank you, @junkew ! I'm eager to learn more about these dictionary objects. Here is my first attempt to implement your example code above to fit my needs, but I'm sure it's inadequate. You won't have any trouble keeping in mind that I'm an old man with only an embarrassingly tiny fraction of my former intellectual capacity I'm most unsure about how to enter and retrieve the elements of the necessary two-dimensional popup list array, as indicated by the double question marks in the comments. I'll post the most relevant functions, with my uneducated interpretation of your code above first... expandcollapse popupFunc _ListDiff( ByRef $arg_PreList, ByRef $arg_PostList ) Local $Lf_DiffAra[1][2] = [ [0, 0] ] Local $Lf_DiffAraSize = 1 Local $Lf_PreListSize = $arg_PreList[0][0] Local $Lf_PostListSize = $arg_PostList[0][0] If $Lf_PreListSize = 0 Then Return $arg_PostList EndIf If $Lf_PostListSize = 0 Then Return $arg_PostList EndIf Local $Lf_PreDictObj = ObjCreate("Scripting.Dictionary") Local $Lf_PostDictObj = ObjCreate("Scripting.Dictionary") For $i = 1 To $Lf_PreListSize $Lf_PreDictObj.add($arg_PreList[$i][1], $arg_PreList[$i][0]) ; Class name, Window handle Next For $i = 1 To $Lf_PostListSize $Lf_PostDictObj.add($arg_PostList[$i][1], $arg_PostList[$i][0]) Next Local $diff = compDic($Lf_PreDictObj, $Lf_PostDictObj) for $i = 0 to $diff.count-1 ReDim $Lf_DiffAra[$Lf_DiffAraSize +1][2] $Lf_DiffAra[$Lf_DiffAraSize][0] = $diff.items[$i][0] ; ?? $Lf_DiffAra[$Lf_DiffAraSize][1] = $diff.items[$i][1] ; ?? $Lf_DiffAra[0][0] += 1 $Lf_DiffAraSize += 1 ;~ consolewrite($diff.keys[$i]) Next ;~ consolewrite(@CRLF) ;~ $diff = compDic($Lf_PostDictObj, $Lf_PreDictObj) ;~ for $i = 0 to $diff.count-1 ;~ consolewrite($diff.keys[$i]) ;~ Next Return $Lf_DiffAra EndFunc func compDic($d1, $d2) Local $oDiff = ObjCreate("Scripting.Dictionary") for $i = 0 to $d1.count-1 if $d2.exists($d1.keys[$i]) Then ;~ consolewrite($d1.keys[$i]) else $oDiff.add($d1.keys[$i], $d1.items[$i]) EndIf Next return $oDiff endfunc Func _GetVLCFailPopups() Const $Lfc_SearchStringCount = 2 Const $Lfc_SearchStringAra[$Lfc_SearchStringCount] = [ "did not close properly last time it was run and will now clean up.", _ "Another instance of VLC Media Player is already running." ] Local $Lf_FoundAra[1][2] = [[ 0, 0 ]], $Lf_FoundIndex = 1 Local $Lf_WinText Local $Lf_PopupAra = _WinAPI_EnumWindowsPopup() Local $Lf_NumPops = $Lf_PopupAra[0][0] If $Lf_NumPops = 0 Then Return $Lf_PopupAra EndIf For $i = 1 To $Lf_NumPops $Lf_WinText = WinGetText( $Lf_PopupAra[$i][0] ) If $Lf_WinText <> "" Then For $j = 0 To $Lfc_SearchStringCount -1 If StringInStr( $Lf_WinText, $Lfc_SearchStringAra[$j], $STR_NOCASESENSEBASIC ) > 0 Then ReDim $Lf_FoundAra[$Lf_FoundIndex +1][2] $Lf_FoundAra[$Lf_FoundIndex][0] = $Lf_PopupAra[$i][0] $Lf_FoundAra[$Lf_FoundIndex][1] = $Lf_PopupAra[$i][1] $Lf_FoundAra[0][0] += 1 $Lf_FoundIndex += 1 EndIf Next EndIf Next Return $Lf_FoundAra EndFunc Func _LaunchVid( $arg_Path ) Local $Lf_Stat, $Lf_VidName, $Lf_PID, $Lf_WinHdl, $Lf_LocalInfoAra[$Gc_NumVidListCols] Local $Lf_VidPath, $Lf_Drv, $Lf_Dir, $Lf_FileName, $Lf_ExtWithDot, $Lf_VLCPath Local $Lf_launchSuccess, $Lf_CloseDone, $Lf_CloseWaitCount $Lf_VLCPath = "" If $G_VLCExePath = "" Then $Lf_VLCPath = RegRead( $Gc_RegRoot, $Gc_VLCexeRegValName ) If @error <> 0 Then $Lf_VLCPath = "" EndIf If $Lf_VLCPath = "" Then _ChooseVLC() ; Create and show a GUI asking for VLC exe path EndIf EndIf $Lf_launchSuccess = True Do Local $Lf_PrePopupList = _GetVLCFailPopups() If IsArray($Lf_PrePopupList) = 0 Then MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PrePopupList is NOT AN ARRAY!") Exit EndIf $Lf_VidPath = '"' & $arg_Path & '"' $Lf_PID = ShellExecute( $G_VLCExePath, $Lf_VidPath, $SHEX_OPEN ) If @error <> 0 Then _ShowMsg("INTERNAL ERROR: Unable to launch VLC to play video") Beep( 1000, 500 ) _WinAPI_FlashWindowEx( $G_VidToolGUI, 3, 2 ) Return -1 EndIf Local $Lf_PostPopupList = _GetVLCFailPopups() If IsArray($Lf_PostPopupList) = 0 Then MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PostPopupList is NOT AN ARRAY!") Exit EndIf Local $Lf_PostAraSize = UBound($Lf_PostPopupList) ; = 64 If $Lf_PostPopupList[0] > 0 Then ; KABOOM! Index out of range? Local $Lf_DiffPopupList = _PopupListDiff( $Lf_PrePopupList, $Lf_PostPopupList ) If $Lf_DiffPopupList[0] > 0 Then $Lf_launchSuccess = False For $i = 1 To $Lf_DiffPopupList[0] WinClose( $Lf_DiffPopupList[$i] ) $Lf_CloseDone = False $Lf_CloseWaitCount = 0 Do If WinExists( $Lf_DiffPopupList[$i] ) = 0 Then $Lf_CloseDone = True Else Sleep( 1000 ) $Lf_CloseWaitCount += 1 EndIf Until $Lf_CloseDone Or ($Lf_CloseWaitCount > 10) Next EndIf EndIf Until $Lf_launchSuccess Return $Lf_PID EndFunc Did I get it anywhere close to what I need? Thanks for your time! Edited August 13, 2019 by Mbee Link to comment Share on other sites More sharing options...
FrancescoDiMuro Posted August 13, 2019 Share Posted August 13, 2019 @Mbee A Dictionary object is like an associative array; it lets you identify your items with a key, which can be a string or an integer, bu nor an array. Your items can be any type of data, arrays too, but that's not the case! So, when you retrieve your data from the dictionary object, you just need to provide the key you set for your item when you added it, and you're done; the Dictionary object is managed as a 1-D array, which is the case. By the way, it's the moment to take a look at VLC Object: Global $objVLC = ObjCreate("VideoLAN.VLCPlugin.2") Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette Link to comment Share on other sites More sharing options...
junkew Posted August 13, 2019 Share Posted August 13, 2019 Seehttps://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object for details of a dictionary. Alternative could be to look at array.au3 which has https://www.autoitscript.com/autoit3/docs/libfunctions/_ArraySearch.htm Not sure on your solution but syntax should be without second selector and the dictionary in itself has other 'arrays' like keys, items you have to use something like $Lf_DiffAra[$Lf_DiffAraSize][0] = $diff.keys[$i] ; ?? $Lf_DiffAra[$Lf_DiffAraSize][1] = $diff.items[$i] ; ?? FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets 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