level 8
ReadDirectoryChangesW这个函数是不是不可以
2013年12月13日 07点12分
1
level 7
#include "ShlObj.h"
SHChangeNotifyRegister
具体用法自行baidu
2013年12月13日 07点12分
2
可能要配合SHGetPathFromIDList函数使用
2013年12月13日 08点12分
回复 code_abc :恩呢 谢谢了 我先百度去了~~~
2013年12月13日 08点12分
level 7
下面是我写过的代码的部分,能看明白吗??
初始化
m_objEntry.pidl = 0;
m_objEntry.fRecursive = TRUE;
m_MonitorID = SHChangeNotifyRegister(this->GetSafeHwnd(), SHCNRF_InterruptLevel|SHCNRF_ShellLevel, SHCNE_ALLEVENTS, WM_FILEMODIFY_NOTIFY, 1, &m_objEntry);
消息函数里,处理WM_FILEMODIFY_NOTIFY消息,(我自己定义的)
TCHAR szFileName0[MAX_PATH], szFileName1[MAX_PATH];
PIDLIST_ABSOLUTE *pID2;
pID2 = (PIDLIST_ABSOLUTE*)wParam;
szFileName0[0] = 0; //source
szFileName1[0] = 0; //det
SHGetPathFromIDList(pID2[0], szFileName0);
SHGetPathFromIDList(pID2[1], szFileName1);
if((SHCNE_UPDATEITEM == lParam) \
|| (SHCNE_DELETE == lParam) \
|| (SHCNE_RENAMEITEM == lParam) \
|| (SHCNE_CREATE == lParam)){。。。}
结束
SHChangeNotifyDeregister(m_MonitorID);
2013年12月13日 08点12分
3
我还是个菜鸟呢 m_objEntry是什么?
2013年12月13日 08点12分
回复 豆豆xiao宽 :SHChangeNotifyEntry 类型结构体m_objEntry;不要在乎这些细节,仔细看,他就是SHChangeNotifyRegister的最后一个参数,知道这个参数要m_objEntry.pidl = 0;m_objEntry.fRecursive = TRUE;这样初始化使用不就ok了,何必要知道每个细节呢??
2013年12月13日 08点12分
这个函数好像只能跟踪文件的创建,删除,能不能得到移动信息你得测试研究一下
2013年12月13日 08点12分
回复 code_abc :谢谢大神不吝赐教 ,我刚刚开始做C++开发 基础不是很好 很多东西只停留在表面上 没有抓住本质啊
2013年12月13日 08点12分
level 7
主要功能的代码,就这几行
#include "stdafx.h"
#include "windows.h"
#include "ShlObj.h"
#define WM_FILEMODIFY_NOTIFY (WM_USER + 1)
static TCHAR gs_tarrWindowClass[] = {_T("my_sh_test_win")};
ATOM MyRegisterClass(HINSTANCE hInstance);
HWND InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int _tmain(int argc, _TCHAR* argv[])
{
MSG msg;
HWND hMain;
SHChangeNotifyEntry objEntry;
ULONG ulMonitorID;
MyRegisterClass(0);
hMain = InitInstance (0, SW_NORMAL);
if(!hMain){ goto WINDOW_EXIT;}
objEntry.pidl = 0;
objEntry.fRecursive = TRUE;
ulMonitorID = SHChangeNotifyRegister(hMain, SHCNRF_InterruptLevel|SHCNRF_ShellLevel, SHCNE_ALLEVENTS, WM_FILEMODIFY_NOTIFY, 1, &objEntry);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
WINDOW_EXIT:
if(ulMonitorID){ SHChangeNotifyDeregister(ulMonitorID);}
printf("\nwindow exit");
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(WM_CLOSE == message){ ::PostQuitMessage(0);}
if(WM_FILEMODIFY_NOTIFY == message)
{
TCHAR szFileName0[MAX_PATH], szFileName1[MAX_PATH];
PIDLIST_ABSOLUTE *pID2;
pID2 = (PIDLIST_ABSOLUTE*)wParam;
szFileName0[0] = 0; //source
szFileName1[0] = 0; //det
SHGetPathFromIDList(pID2[0], szFileName0);
SHGetPathFromIDList(pID2[1], szFileName1);
switch(lParam)
{
case SHCNE_UPDATEITEM:{ printf("\ncode:SHCNE_UPDATEITEM:");}break;
case SHCNE_DELETE:{ printf("\ncode:SHCNE_DELETE:");}break;
case SHCNE_RENAMEITEM:{ printf("\ncode:SHCNE_RENAMEITEM:");}break;
case SHCNE_CREATE:{ printf("\ncode:SHCNE_CREATE:");}break;
default:{ printf("\ncode:%08x:", lParam);}break;
}
printf("\n\tsrc:%s", szFileName0);
printf("\n\tdet:%s", szFileName1);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = 0;
wcex.lpszClassName = gs_tarrWindowClass;
wcex.hIconSm = 0;
return RegisterClassEx(&wcex);
}
HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(gs_tarrWindowClass, _T("sh_test"), WS_OVERLAPPEDWINDOW, 30, 30, 40, 60, 0, NULL, hInstance, NULL);
if(!hWnd){ return 0;}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return hWnd;
}
#pragma comment(lib, "shell32.lib")
2013年12月14日 04点12分
6
感谢大神!!您真是个好人!!!
2013年12月14日 05点12分