如何代码实现隐藏或显示文件后缀名等?

采石工 2012-09-02 06:31:21
在文件夹选项中可以实现如下的功能:
隐藏或显示受保护的操作系统文件
显示或显示所有的文件和文件夹
隐藏或显示文件后缀名

请问大家如何让利用代码实现么?谢谢大家!
...全文
790 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 10 楼 的回复:

C/C++ code
DWORD dwState = 0x00000001; // 0显示
lStatus = SHSetValue(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"),
T……

你好,我尝试了你的代码……
[/Quote]
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,0,0);
再不行发送WM_SETTINGCHANGE消息试试能更新吗?
采石工 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

C/C++ code
DWORD dwState = 0x00000001; // 0显示
lStatus = SHSetValue(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"),
T……
[/Quote]
你好,我尝试了你的代码,似乎可以修改注册表的键值。但不会立即更新(即显示或隐藏文件的扩展名,仍然需要重启资源管理器),同时还注意到MSDN中对SHSetValue的描述中说到,这个函数的第四个参数只支持 REG_SZ类型。不知何故。于是我修改了你的代码如下,但仍不会立即更新!希望解惑!

#include <shlobj.h>
#include <windows.h>
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"advapi32.lib")
int main()
{
DWORD dwState = 0x00000001; // 0显示
HKEY hk;
RegCreateKey(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"),
&hk);
LONG lStatus=RegSetValueEx(
hk,
TEXT("HideFileExt"),
0,
REG_DWORD,
(LPBYTE)&dwState,
sizeof(DWORD)
);

if (lStatus == ERROR_SUCCESS)
{
SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_IDLIST|SHCNF_NOTIFYRECURSIVE, 0, 0);
}

return 0;
}
「已注销」 2012-09-03
  • 打赏
  • 举报
回复
SHSetValues 虽然 MSDN 说了只支持 REG_SZ,但实际测试任何类型都支持。
我今天也是试了半天还没找到可以生效的方法,倒是直接在桌面按 F5 就能生效。
「已注销」 2012-09-03
  • 打赏
  • 举报
回复
DWORD dwState = 0x00000001; // 0显示
lStatus = SHSetValue(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"),
TEXT("HideFileExt"),
REG_DWORD,
&dwState,
sizeof(DWORD)
);
if (lStatus == ERROR_SUCCESS) {
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
}
这个对。
「已注销」 2012-09-03
  • 打赏
  • 举报
回复
需包含 shlwapi.h,链接到 shlwapi.lib。
DWORD dwState = 0x00000001; // 0显示
lStatus = SHSetValue(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"),
TEXT("HideFileExt"),
REG_DWORD,
&dwState,
sizeof(DWORD)
);
if (lStatus == ERROR_SUCCESS) {
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT, 0, 0);
}
采石工 2012-09-03
  • 打赏
  • 举报
回复
谢谢大家,我明白了,有时候不会立即更新,但刷新一下资源管理器就可以了。下面是改写的测试代码,用于显示时隐藏后缀名,隐藏时显示后缀名。与大家分享!

#include <shlobj.h>
#include <windows.h>
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"advapi32.lib")

int main()
{
HKEY hk;
RegCreateKey(HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), &hk);

DWORD dwState;
DWORD dwType;
DWORD dwSize=sizeof(DWORD);
LONG lStatus=RegQueryValueEx(hk,TEXT("HideFileExt"),0,&dwType,(LPBYTE)&dwState,&dwSize);

if (lStatus == ERROR_SUCCESS)
{
if(dwState==0)
{
dwState=1;
}
else
{
dwState=0;
}

lStatus = RegSetValueEx(hk,TEXT("HideFileExt"),0,REG_DWORD,(LPBYTE)&dwState,sizeof(DWORD));
if (lStatus == ERROR_SUCCESS)
{
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,0,0);
}
}

return 0;
}

Gloveing 2012-09-02
  • 打赏
  • 举报
回复
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced中的HideFileExt键,它的值为0表示显示扩展名,为1不显示
长尾巴的悟空 2012-09-02
  • 打赏
  • 举报
回复
我觉得导入注册表又快又方便。。哈哈,
jingzhongrong 2012-09-02
  • 打赏
  • 举报
回复
试试SHChangeNotify
dickbarry 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

也可以用注册表实现,google一下注册表位置就可以了

谢谢,这里需要终止资源管理器,而在文件夹选项进行设置时不需要。它是怎样做到的呢?
[/Quote]

这个确实不了解...
采石工 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

也可以用注册表实现,google一下注册表位置就可以了
[/Quote]
谢谢,这里需要终止资源管理器,而在文件夹选项进行设置时不需要。它是怎样做到的呢?
dickbarry 2012-09-02
  • 打赏
  • 举报
回复
也可以用注册表实现,google一下注册表位置就可以了
采石工 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

用注册表
隐藏
C/C++ code

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 1 /f
taskkill /f /im explorer.exe
start explorer.exe


……
[/Quote]
谢谢你那么如何实现另外两个功能呢?
dickbarry 2012-09-02
  • 打赏
  • 举报
回复
用注册表
隐藏

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 1 /f
taskkill /f /im explorer.exe
start explorer.exe

显示

add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f
taskkill /f /im explorer.exe
start explorer.exe


用这两个批处理,或者自己通过RegSetValueEx也可以,但要注销一次explorer,否则没有办法立即生效。要灭掉explorer,可以自己TerminateProcess,再CreateProcess。建议直接用批处理

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧