![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.34.105] |
![]() |
|
Сообщ.
#1
,
|
|
|
Господа, помогите разобраться, почему не хочет работать SSF_SHOWSUPERHIDDEN на Скрытие/Показ защищенных системных файлов. При этом, функция, которая определяет состояние файлов, работает корректно.
![]() ![]() // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!) procedure SHShowSuperHiddenFile(show: Boolean); var lpss: SHELLSTATE; bShowAll: Boolean; begin ZeroMemory(@lpss, sizeof(lpss)); // Получаем текущее состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False); // Проверяем текущее состояние bShowAll := (lpss.Data and SSF_SHOWSUPERHIDDEN) = SSF_SHOWSUPERHIDDEN; // Если изменилось if (bShowAll <> show) then begin if (Show) then lpss.Data := 1 else lpss.Data :=0; // Меняем состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True); // Сообщение Проводнику об изменениях SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil); end; end; // Определяем, скрыты или нет защищенные файлы function ShGetShowSuperHiddenFileState:boolean; var lpss: SHELLSTATE; begin ZeroMemory(@lpss, sizeof(lpss)); // Получаем текущее состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False); // Возвращаем состояние result:= (lpss.Data and SSF_SHOWSUPERHIDDEN) = SSF_SHOWSUPERHIDDEN; end; // Скрываем/Показываем защищенные файлы procedure TForm1.Button1Click(Sender: TObject); begin if ShGetShowSuperHiddenFileState then SHShowSuperHiddenFile(false) else SHShowSuperHiddenFile(true); end; |
![]() |
Сообщ.
#2
,
|
|
Тебя не смущает что lpss.Data это Word а SSF_SHOWSUPERHIDDEN это DWORD?
Ты же все ломаешь нафиг выставляя и проверяя не те флаги. ![]() ![]() // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!) procedure SHShowSuperHiddenFile(show: Boolean); var lpss: SHELLSTATE; begin ZeroMemory(@lpss, sizeof(lpss)); // Получаем текущее состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False); if lpss.fShowSuperHidden <> show then begin lpss.fShowSuperHidden := show; // Меняем состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True); // Сообщение Проводнику об изменениях SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil); end; end; // Определяем, скрыты или нет защищенные файлы function ShGetShowSuperHiddenFileState:boolean; var lpss: SHELLSTATE; begin ZeroMemory(@lpss, sizeof(lpss)); // Получаем текущее состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False); // Возвращаем состояние result:= lpss.fShowSuperHidden; end; |
Сообщ.
#3
,
|
|
|
От чего же?... У меня вот так это дело прописано:
![]() ![]() type tagSHELLSTATEW = record Data: DWORD; Data2: UINT; lParamSort: Integer; iSortDirection: Integer; version: UINT; uNotUsed: UINT; end; SHELLSTATEA = tagSHELLSTATEW; SHELLSTATEW = tagSHELLSTATEW; SHELLSTATE = SHELLSTATEW; TShellState = SHELLSTATE; PShellState = ^TShellState; const //Data fShowAllObjects = $00000001; fShowExtensions = $00000002; fNoConfirmRecycle = $00000004; fShowSysFiles = $00000008; fShowCompColor = $00000010; fDoubleClickInWebView = $00000020; fDesktopHTML = $00000040; fWin95Classic = $00000080; fDontPrettyPath = $00000100; fShowAttribCol = $00000200; fMapNetDrvBtn = $00000400; fShowInfoTip = $00000800; fHideIcons = $00001000; fWebView = $00002000; fFilter = $00004000; fShowSuperHidden = $00008000; fNoNetCrawling = $00010000; //Data2 fSepProcess = $00000001; fStartPanelOn = $00000002; fShowStartPage = $00000004; fAutoCheckSelect = $00000008; fIconsOnly = $00000010; fShowTypeOverlay = $00000020; const SSF_SHOWALLOBJECTS = $00000001; SSF_SHOWEXTENSIONS = $00000002; SSF_HIDDENFILEEXTS = $00000004; SSF_SERVERADMINUI = $00000004; SSF_SHOWCOMPCOLOR = $00000008; SSF_SORTCOLUMNS = $00000010; SSF_SHOWSYSFILES = $00000020; SSF_DOUBLECLICKINWEBVIEW = $00000080; SSF_SHOWATTRIBCOL = $00000100; SSF_DESKTOPHTML = $00000200; SSF_WIN95CLASSIC = $00000400; SSF_DONTPRETTYPATH = $00000800; SSF_SHOWINFOTIP = $00002000; SSF_MAPNETDRVBUTTON = $00001000; SSF_NOCONFIRMRECYCLE = $00008000; SSF_HIDEICONS = $00004000; SSF_FILTER = $00010000; SSF_WEBVIEW = $00020000; SSF_SHOWSUPERHIDDEN = $00040000; SSF_SEPPROCESS = $00080000; SSF_NONETCRAWLING = $00100000; SSF_STARTPANELON = $00200000; SSF_SHOWSTARTPAGE = $00400000; procedure SHGetSetSettings(var lpss: TShellState; dwMask: DWORD; bSet: BOOL) stdcall; external 'shell32.dll'; Или этот код не верный? |
![]() |
Сообщ.
#4
,
|
|
Используй то что прописано в ShlObj, а не этот кривой костыль, тем более не правильно задекларированный.
Версия дельфи какая? |
Сообщ.
#5
,
|
|
|
Да в том то и дело, что на семерке еще, вот и цепляю код от куда придется... Для себя пишу.
|
![]() |
Сообщ.
#6
,
|
|
Понятно, тогда вот так делай...
![]() ![]() type TShellState = record { это все сидит в Flags1 BOOL fShowAllObjects : 1; BOOL fShowExtensions : 1; BOOL fNoConfirmRecycle : 1; BOOL fShowSysFiles : 1; BOOL fShowCompColor : 1; BOOL fDoubleClickInWebView : 1; BOOL fDesktopHTML : 1; BOOL fWin95Classic : 1; BOOL fDontPrettyPath : 1; BOOL fShowAttribCol : 1; // No longer used, dead bit BOOL fMapNetDrvBtn : 1; BOOL fShowInfoTip : 1; BOOL fHideIcons : 1; BOOL fWebView : 1; BOOL fFilter : 1; BOOL fShowSuperHidden : 1; <<< это 15-ый бит!!! Его передаем в IsBitOn/ChangeBitValue BOOL fNoNetCrawling : 1; } Flags1: DWORD; dwWin95Unused: DWORD; // Win95 only - no longer supported pszHiddenFileExts uWin95Unused: UINT; // Win95 only - no longer supported cbHiddenFileExts // Note: Not a typo! This is a persisted structure so we cannot use LPARAM lParamSort: Long; iSortDirection: Integer; version: UINT; // new for win2k. need notUsed var to calc the right size of ie4 struct // FIELD_OFFSET does not work on bit fields uNotUsed: UINT; // feel free to rename and use { это все сидит в Flags2 BOOL fSepProcess: 1; // new for Whistler. BOOL fStartPanelOn: 1; //Indicates if the Whistler StartPanel mode is ON or OFF. BOOL fShowStartPage: 1; //Indicates if the Whistler StartPage on desktop is ON or OFF. // new for Windows Vista BOOL fAutoCheckSelect: 1; BOOL fIconsOnly: 1; BOOL fShowTypeOverlay: 1; // new for Windows 8 BOOL fShowStatusBar : 1; UINT fSpareFlags : 9; } Flags2: Word; end; procedure SHGetSetSettings(var lpss: TShellState; dwMask: DWORD; bSet: BOOL) stdcall; external 'shell32.dll'; function IsBitOn(Value: DWORD; BitIndex: Byte): Boolean; begin Result := Value and (1 shl BitIndex) <> 0; end; procedure ChangeBitValue(var Value: DWORD; BitIndex: Byte; BitOn: Boolean); begin if BitOn then Value := Value or (1 shl BitIndex) else Value := Value and not (1 shl BitIndex); end; // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!) procedure SHShowSuperHiddenFile(show: Boolean); var lpss: TShellState; begin ZeroMemory(@lpss, sizeof(TShellState)); // меняем состояние 15-го бита в структуре, который содержит значение SHOWSUPERHIDDEN!!! ChangeBitValue(lpss.Flags1, 15, show); // Меняем состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True); // Сообщение Проводнику об изменениях SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil); end; // Определяем, скрыты или нет защищенные файлы function ShGetShowSuperHiddenFileState:boolean; var lpss: TShellState; begin ZeroMemory(@lpss, sizeof(TShellState)); // Получаем текущее состояние SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False); // Возвращаем состояние из 15-го бита!!! result := IsBitOn(lpss.Flags1, 15); end; |
Сообщ.
#7
,
|
|
|
Самое интересное, что ShGetShowSuperHiddenFileState работает корректно. У меня и в предыдущей версии подобная функция отлично работала. А вот SHShowSuperHiddenFile не хочет работать. Проверяю через Параметры папок:
Прикреплённый файл ![]() |
Сообщ.
#8
,
|
|
|
Ребята, будут еще какие-то идеи?
|