mrak1990
Цитата:
Я тут переписал твой скрипт в таком виде, в каком, как мне кажется проще его понять начинающим. Плюс добавил комментарии.
|
Спасибо.
Правда комментарии немного не точные, так будет правильнее (также немного изменил функции, раньше если небыло найдено окон, то рабочий стол тоже не обновлялся, а также во второй функции сразу помещаются в массив уникальные идентификаторы (hWnd), чтобы не нужно было их определять в первой функции - они ведь возвращаются от WinList() ):
Код:

Func _UpdateExplorer()
;Устанавливаем параметр, отвечающий за метод распознвания заголовок окон (4 - самый чувствительный),
;и помещаем в переменную $OldOpt исходное значение этого параетра.
Local $OldOpt = Opt("WinTitleMatchMode", 4)
;Получаем массив содержащий заголовки окон проводника Windows вкдючая Рабочего стола (по средствам функции _ExplWinGetList).
Local $WinExpListArr = _ExplWinGetList()
;Если возвратился массив (а значит найдены заголовки окон),
;то перебираем весь массив, с целью обновления каждого окна (по его заголовку из элементов массива).
If IsArray($WinExpListArr) Then
For $iWin = 1 To $WinExpListArr[0]
;Вызов функции для обновления текущего окна
;(по уникальному идентификатору который содержится в текущем элементе массива).
DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr[$iWin], "int", 0x111, "int", 28931, "int", 0)
Next
Else
;Если не вернулся массив (значит небыли найдены окна проводника), тогда обновляем только Рабочий стол
;(переменная $WinExpListArr теперь содержит только один уникальный идентификатор Рабочего стола).
DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr, "int", 0x111, "int", 28931, "int", 0)
EndIf
;Устанавливаем исходное значение (заданное значение при входе в функцию) параметра,
;отвечающего за метод распознвания заголовок окон.
Opt("WinTitleMatchMode", $OldOpt)
EndFunc
Func _ExplWinGetList()
;Получаем массив, содержащий список существующих заголовок окон проводника Windows (Explorer),
;и их уникальный идентификатор (hWnd).
Local $WinList = WinList("classname=CabinetWClass")
;Если вернулся массив (а значит найдено одно или более окон), тогда делаем перебор по массиву,
;в целях отсеивания только уникальных идентификаторов существующих окон (проводника Windows).
If IsArray($WinList) Then
;Объявляем массив, который будет собдержать список уникальных идентификаторов существующих окон.
Local $WinListArr[UBound($WinList)+1]
;Перебираем полученный массив $WinList, и отсеиваем в новый массив $WinListArr
;только уникальные идентификаторы окон Explorer.
For $iW = 1 To $WinList[0][0]
$WinListArr[$iW] = $WinList[$iW][1]
Next
;Присваеваем нулевому элементу нового массива ($WinListArr), значение ровняющееся общему количеству элементов в этом массиве.
$WinListArr[0] = UBound($WinListArr)-1
;Присваиваем последнему элементу этого же массива, уникальный идентификатор (основываясь на "Classname") Рабочего стола.
$WinListArr[$WinListArr[0]] = WinGetHandle("classname=Progman")
;Возвращаем массив, содержащий список идентификаторов всех существующих окон проводника (вкючая Рабочего стола).
Return $WinListArr
Else
;Если функция WinList() не "вернула" массив (а значит небыло найдено окон проводника),
;тогда возвращаем только один уникальный идентификатор Рабочего стола.
Return WinGetHandle("classname=Progman")
EndIf
EndFunc