Войти

Показать полную графическую версию : Обновление проводника Explorer после смены сис. параметров


Creat0R
14-05-2009, 22:48
Начало обсуждения темы (http://forum.oszone.net/post-1118480.html#post1118480)

_SendMessage(0xFFFF, 0x001D, 0, 0) отправляет сообщение об установке шрифта (WM_FONTCHANGE) всем окнам верхнего уровня (HWND_BROADCAST). »
Интересно, этот Hwnd не может быть использован для обновления сделанных настроек в реестре? К примеру после скрытия расширения файлов (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt)...

Yashied
14-05-2009, 23:03
Интересно, этот Hwnd не может быть использован для обновления сделанных настроек в реестре? К примеру после скрытия расширения файлов (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt)... »
Это лучше сделать следующим образом:
func _UpdateExplorer()

local $Opt = Opt('WinSearchChildren', 1)
local $List = WinList('[CLASS:SHELLDLL_DefView]')

for $i = 1 To UBound($List) - 1
DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $List[$i][1], 'int', 0x0111, "int", 0x7103, 'int', 0)
next

Opt('WinSearchChildren', $Opt)

endfunc; _UpdateExplorer

Это было на оф. форуме, ты мог это видеть.

HWND_BROADCAST просто говорит Windows о том, что сообщение должно быть отправлено во все окна независимо от их состояния (SHOW, HIDE, и т.д.).

Creat0R
14-05-2009, 23:55
Это лучше сделать следующим образом: »
Супер!!! Я долго мучался над этим, до сих пор я посылал это-же сообщение всем окнам explorer'а! (включая открытые диалоги типа FileSaveDialog()).

Как оно сделано можно увидеть в утилите Toggle Hidden Files & Files Extension (http://creator-lab.ucoz.ru/load/4-1-0-40).

P.S
И всё же, лучше вместо значении сообщении использовать сами константы, так будет яснее для всех. Что такое «0x7103»?

Yashied
15-05-2009, 00:28
Хорошо.

Global Const $WM_COMMAND = 0x0111
...
DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $List[$i][1], 'int', $WM_COMMAND, "int", 0x7103, 'int', 0)
...

Что такое 0x7103 лучше спросить здесь (http://www.autoitscript.com/forum/index.php?s=&showtopic=92690&view=findpost&p=666239), но лучше этого не делать. :)

Creat0R
15-05-2009, 15:18
Что такое 0x7103 лучше спросить здесь»
:lol: почитав более поздние комменты валика, я чуть не упал со стула.

Но если серъёзно, он не прав, он просто забыл что такое новичёк! И спросить про сообщение не помешало бы, т.к он сам где то писал что Magic Numbers (a.k.a «литеральные значения констант») использовать неприемлимо, но делать этого я не буду. Я предпочитаю спрашивать (http://www.google.ru/search?hl=ru&newwindow=1&q=WM_COMMAND+%2B28931&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=) сначала у гугля, и он вроде дал ответ (http://www.theeldergeek.com/forum/index.php?showtopic=35778&view=findpost&p=235495):

Navigate to Menu > 215 > English > on the right pane, select Refresh and it shows 28931, these are some findings that maybe usefull for WM_COMMAND.
Refresh - 28931
Undo - 28699
Paste - 28698

Т.е это попросту идентификатор пункта в меню, и мы его вызываем.

Если покапаться дальше, то это будет работать не во всех системах, там ещё пишут что вроде в Vista нужен уже другой идентфикатор, т.ч это не универсальный метод, нужно вызывать саму комманду, а не исполняющий элемент...

Yashied
15-05-2009, 16:35
там ещё пишут что вроде в Vista нужен уже другой идентфикатор »
В Vista и Windows 7 работает отлично.

Yashied
17-05-2009, 19:36
CreatOR, похоже лучше этого способа обновить Windows Explorer никто не знает. На оф. форуме все молчат, ну Вы наверное это уже видели. Меня просто задел этот вопрос, но ответа я так и не нашел. В интернете тоже все много разных решений предлагают. 90% из них не работают или работают, но криво. Вообщем, пока пользуюсь этим. Если у кого нибудь есть идеи, то пожалуйста отпишитесь в этой ветке.

Кстати, там ошибка. Я поправил.

for $i = 1 To UBound($List) - 1

:shout:




© OSzone.net 2001-2012