我用程序将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.................
试试这个?我没有测试
但是问题是不知道刷新窗口的sendmessage的格式
呵呵
帮你顶
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点起呢。
败了,败了,被老爹骂明天接着弄,今天不行了觉觉。。楼主先自己想办法吧
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就会重画窗口
但是也不行 先广播再刷新还是不行...
而右件刷新的刷新消息直接发送到了文件夹的那个ListView中
着就是区别
你找到文件夹显示文件的listview句丙再发送刷新消息看看
果然呵呵
用这个就ok
顺便问下lsftest你用什么跟踪系统消息的阿
=======================
myspy一个类似于spy++但功能稍强(作者自称)的工具
谢谢寒江大哥哭了,我没完成就放弃了这个问题。。竟然。抹鼻涕ING