我用程序将HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt的值改为1(隐藏已知类型的扩展名),桌面和可当前已经打开的文件夹不会立即刷新(但如果你新进一个目录,你会发现扩展名消失了),也就是说扩展名还在,如果右键刷新,扩展名就消失了。可是如果文件夹选项中修改,桌面和可当前已经打开的文件夹中的文件的扩展名会立即消失,想问,有办法作到吗?首先要说的是,模拟F5键是绝对不行的。第一,如果当前窗口是IE就变成刷新网页了;第二,我发现F5和右键刷新不一样,前者不能使扩展名消失。另外SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0是使要重起才生效的设置不需重起就生效,也没用,因为我这个设置其实已经生效了,只是没刷新显示而已。SHChangeNotify SHCNE_ASSOCCHANGED, SHCNF_IDLIST + SHCNF_FLUSH, nil, nil我也试了,没用,虽然屏幕会闪一下,估计和按F5一个效果。HELP.................

解决方案 »

  1.   

    SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,buf)
    试试这个?我没有测试
      

  2.   

    我在另外个论坛上看到了好像有人说用sendmessage
    但是问题是不知道刷新窗口的sendmessage的格式
    呵呵
    帮你顶
      

  3.   

    真的好难吗。。我去试试,我这里倒有一个有用的代码,是用来获取PWTEXT内容的不是直接发GETTEXT那种,呵呵。看看去
      

  4.   

    恩,以下代码在XP ,VB6SP6下测试通过,测试时,楼主可以把我注释掉的部分去掉,然后开N个文件夹窗口,运行后程序会在DEBUG中回显刷新了多少个窗体,他们的HWND分别是什么Option Explicit'查找窗口
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long'发送消息
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101
    Private Const WM_KILLFOCUS = &H8
    Private Const WM_SETFOCUS = &H7Private Sub Form_Click()
    '获取文件夹视图句柄(这个句柄是文件夹窗体标题栏的),并执行刷新操作
    mGetWindow "CabinetWClass", vbNullString
    End Sub'刷新文件夹视图的函数
    Private Sub mRefreshFolderView(ByVal hwnd As Long, ByVal VB_Key As Long)
    '取消焦点状态(非不要,去掉也可以)
    PostMessage hwnd, WM_KILLFOCUS, 0, 0
    '发送F5,进行刷新,总觉得直接发送KEYUP就好...
    PostMessage hwnd, WM_KEYDOWN, VB_Key, 0&
    PostMessage hwnd, WM_KEYUP, VB_Key, 0&
    '设置焦点状态,这里是关键,不设置这个怎么也不不刷新的
    '*******************************************************
    PostMessage hwnd, WM_SETFOCUS, 0, 0
    '*******************************************************
    End Sub'获取指定窗口句柄,这里用了FINDWINDOWEX,从而历遍所有文件夹窗口,被注释掉的部分用来统计有多少个窗口被刷新
    Private Function mGetWindow(ByVal cName As String, ByVal fCaption As String) As Boolean
        Dim bWnd As Long
        Dim bWndback As Long
        'Dim i As Long
        bWndback = 0
        Do
        '获取窗口句柄
            bWnd = FindWindowEx(0, bWndback, cName, fCaption)
            If bWnd <> 0 Then '如果存在,就刷新
                mRefreshFolderView bWnd, vbKeyF5
            Else
                Exit Function
                mGetWindow = False
            End If
            bWndback = bWnd '将查找起点保存
            'i = i + 1: Debug.Print i, bWnd
        Loop
        mGetWindow = True
    End Function
    OK了,任务结束,该睡觉了,忙了20来分钟,明天还要6点起呢。
      

  5.   

    首先要说的是,模拟F5键是绝对不行的。第一,如果当前窗口是IE就变成刷新网页了;第二,我发现F5和右键刷新不一样,前者不能使扩展名消失。恩,上面代码倒是解决了第一个问题,代码里是识别文件夹然后操作的,F5刷新和右键刷新有什么不同我还真不知道,为了测试楼主这个问题,我是用把文件设置成隐藏的,当设置隐藏以后呢,文件不会消失,需要刷新,我上面的办法可以的,我再去测试一下楼主的问题,改改我的注册表
      

  6.   

    哇,太强悍了。真的不行来。。呵呵,换换恩恩,我哭了,发送CTRL+R和F5一个效果。。问题出在哪呢,右键的时候读了注册表而F5时只是简单的刷新?
    败了,败了,被老爹骂明天接着弄,今天不行了觉觉。。楼主先自己想办法吧
      

  7.   

    每办法他挑衅起的我去查了下还有个刷新窗口的函数好像是
    InvalidateRect,InvalidateRectBynum VB声明 
    Declare Function InvalidateRect& Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long)
    Declare Function InvalidateRectBynum& Lib "user32" Alias "InvalidateRect" (ByVal hwnd As Long, ByVal lpRect As Long, ByVal bErase As Long) 
    说明 
    这个函数屏蔽一个窗口客户区的全部或部分区域。这会导致窗口在事件期间部分重画 
    返回值 
    Long,非零表示成功,零表示失败 
    参数表 
    参数 类型及说明 
    hwnd Long,待屏蔽窗口的句柄 
    lpRect RECT,用于描述待屏蔽矩形部分的一个矩形结构。可用InvalidateRectBynum函数,同时将lpRect设为零(Long数据类型),从而屏蔽(或禁用)整个窗口 
    bErase Long,TRUE(非零)导致指定的区域在重画前先删除 
    注解 
    一旦系统有些更新屏幕的闲置时间可用,windows就会重画窗口
     
    但是也不行 先广播再刷新还是不行...
      

  8.   

    按F5刷新消息只是发送到了窗口
    而右件刷新的刷新消息直接发送到了文件夹的那个ListView中
    着就是区别
    你找到文件夹显示文件的listview句丙再发送刷新消息看看
      

  9.   

    跟踪了一下消息,看到在“可是如果文件夹选项中修改,桌面和可当前已经打开的文件夹中的文件的扩展名会立即消失”的时候会出现WM_WININICHANGE消息。。没其他好办法的时候或者试试吧
      

  10.   

    BroadcastSystemMessage(BSF_FLUSHDISK, nil, WM_WININICHANGE, 0, 0)
    果然呵呵
    用这个就ok
    顺便问下lsftest你用什么跟踪系统消息的阿
      

  11.   

    SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,(LPARAM)(LPTSTR)lpData,SMTO_NORMAL,1000,&dwResult);
      

  12.   

    http://bbs.mscommunity.com/forums/ShowThread.aspx?PostID=7443Jiang,Sheng(蒋晟)[MVP]
      

  13.   

    顺便问下lsftest你用什么跟踪系统消息的阿
    =======================
    myspy一个类似于spy++但功能稍强(作者自称)的工具
      

  14.   

    SendMessage HWND_BROADCAST, WM_WININICHANGE, 把句柄传递过去
      

  15.   

    TO aspower_(我是菜鸟!不象某些bb不懂装懂!还装清高!) Myspy的下载地址给我好吗?我找了几个地方都无法等入(可能是校园网的问题,不过设了代理也步行),发给我也可以:[email protected],谢谢另外,发送消息的参数很让人头疼呀,MSDN看的我头晕晕的,我怎么都试不成功呀,还要麻烦你哟。
      

  16.   

    下载地址http://www.yqdown.com/down.asp?id=2305&no=1
      

  17.   

    :(
    谢谢寒江大哥哭了,我没完成就放弃了这个问题。。竟然。抹鼻涕ING