怎样用SHChangeNotifyRegister监视驱动器改动,各位大虾请进来看看

careprad 2005-07-01 07:24:35
如题,
SHChangeNotifyRegister的原形如下:
SHChangeNotifyRegister
(
HWND hwnd, //1
int fSources, //2
LONG fEvents, //3
UINT wMsg, //4
int cEntries, //5
SHChangeNotifyEntry *pfsne //6
)

我还是不太懂第2,5,6个参数该怎样设置
我要监视SHCNE_DRIVEREMOVED和SHCNE_DRIVEADD消息
那么第二个参数应该是什么值呢,不知是否是0x0002(SHCNRF_ShellLevel)
第5,6个参数真不知道干什么用
请各位大虾指点迷津!
万谢!
...全文
716 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
idAnts 2005-07-03
  • 打赏
  • 举报
回复
我的不是vs.net的。是vc6的程序。但是由于SHChangeNotifyRegister等函数在vc6的库里没有,所以我用了2003的库。
第5个参数是需要监视的个数。
careprad 2005-07-03
  • 打赏
  • 举报
回复
谢了,我在调!
idAnts 2005-07-02
  • 打赏
  • 举报
回复
开始监视:
ULONG id = 0;
LPITEMIDLIST pidlRoot = NULL;
LPMALLOC pMalloc = NULL;
SHGetMalloc(&pMalloc);
SHGetSpecialFolderLocation(m_hWnd,CSIDL_DESKTOP,&pidlRoot);

SHChangeNotifyEntry SHCNE;
SHCNE.pidl = pidlRoot;
SHCNE.fRecursive = TRUE;
id = SHChangeNotifyRegister(m_hWnd,SHCNF_TYPE | SHCNF_IDLIST/*SHCNRF_ShellLevel*/,
SHCNE_ALLEVENTS | SHCNE_INTERRUPT/*SHCNE_CREATE*/,
WM_CHANGED,1,&SHCNE);

if(pidlRoot)
{
pMalloc->Free(pidlRoot);
}
pMalloc->Release();


结束监视:
SHChangeNotifyDeregister(id);


收到文件变化的消息处理:
int Num_line = 0;

SHNOTIFYSTRUCT *pNotify = (SHNOTIFYSTRUCT *)wParam;
char szFileName[MAX_PATH*10];
char szPath[MAX_PATH];
SHFILEINFO shFileInfo;
CHARRANGE charrange;
charrange.cpMax = -1;
charrange.cpMin = -1;

char szShCne[30];
GetShString(lParam,szShCne,30);

switch(lParam)
{
case SHCNE_FREESPACE:
case SHCNE_UPDATEIMAGE:
wsprintf(szFileName,"%d %s\r\n\r\n",Num_line++,szShCne);
GetDlgItem(IDC_EDIT1)->SendMessage(EM_EXSETSEL,0,(long)&charrange);
GetDlgItem(IDC_EDIT1)->SendMessage(EM_REPLACESEL,FALSE,(long)szFileName);
break;
default:
if(pNotify->dwItem1)
{
memset(szFileName,0,MAX_PATH);
memset(szPath,0,MAX_PATH);
SHGetFileInfo((char*)pNotify->dwItem1,0,&shFileInfo,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
SHGetPathFromIDList((LPCITEMIDLIST)pNotify->dwItem1,szPath);
wsprintf(szFileName,"%d (1):%s\r\nPath:%s\r\nName:%s\r\n\r\n",
Num_line++,szShCne,szPath,shFileInfo.szDisplayName);

GetDlgItem(IDC_EDIT1)->SendMessage(EM_EXSETSEL,0,(long)&charrange);
GetDlgItem(IDC_EDIT1)->SendMessage(EM_REPLACESEL,FALSE,(long)szFileName);
}
if(pNotify->dwItem2)
{
memset(szFileName,0,MAX_PATH);
memset(szPath,0,MAX_PATH);
SHGetFileInfo((char*)pNotify->dwItem2,0,&shFileInfo,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
SHGetPathFromIDList((LPCITEMIDLIST)pNotify->dwItem2,szPath);
wsprintf(szFileName,"%d (2):%s\r\nPath:%s\r\nName:%s\r\n\r\n",
Num_line++,szShCne,szPath,shFileInfo.szDisplayName);

GetDlgItem(IDC_EDIT1)->SendMessage(EM_EXSETSEL,0,(long)&charrange);
GetDlgItem(IDC_EDIT1)->SendMessage(EM_REPLACESEL,FALSE,(long)szFileName);
}
break;
}
return 0;
/////////////////////////////////////////////////////////////////////////////////
注意:GetDlgItem(IDC_EDIT1)............是我在edit1里把结果显示出来,你根据需要修改。
idAnts 2005-07-02
  • 打赏
  • 举报
回复
#define WM_CHANGED WM_USER+1

typedef struct {
LPCITEMIDLIST pidl;
BOOL fRecursive;
} SHChangeNotifyEntry;

typedef struct {
DWORD dwItem1;
DWORD dwItem2;
}SHNOTIFYSTRUCT;

#define SHCNE_RENAMEITEM 0x00000001L
#define SHCNE_CREATE 0x00000002L
#define SHCNE_DELETE 0x00000004L
#define SHCNE_MKDIR 0x00000008L
#define SHCNE_RMDIR 0x00000010L
#define SHCNE_MEDIAINSERTED 0x00000020L
#define SHCNE_MEDIAREMOVED 0x00000040L
#define SHCNE_DRIVEREMOVED 0x00000080L
#define SHCNE_DRIVEADD 0x00000100L
#define SHCNE_NETSHARE 0x00000200L
#define SHCNE_NETUNSHARE 0x00000400L
#define SHCNE_ATTRIBUTES 0x00000800L
#define SHCNE_UPDATEDIR 0x00001000L
#define SHCNE_UPDATEITEM 0x00002000L
#define SHCNE_SERVERDISCONNECT 0x00004000L
#define SHCNE_UPDATEIMAGE 0x00008000L
#define SHCNE_DRIVEADDGUI 0x00010000L
#define SHCNE_RENAMEFOLDER 0x00020000L
#define SHCNE_FREESPACE 0x00040000L

#define SHCNRF_ShellLevel 0x0002

SHSTDAPI_(ULONG) SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg, int cEntries, SHChangeNotifyEntry *pshcne);
SHSTDAPI_(BOOL) SHChangeNotifyDeregister(unsigned long ulID);

#pragma comment(lib,"C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\PlatformSDK\\Lib\\shell32.lib")

void GetShString(LONG event,LPSTR str,int len)
{
if((!str) || (len < 30))
{
return;
}
switch(event)
{
case SHCNE_RENAMEITEM:
strcpy(str,"SHCNE_RENAMEITEM");
break;
case SHCNE_CREATE:
strcpy(str,"SHCNE_CREATE");
break;
case SHCNE_DELETE:
strcpy(str,"SHCNE_DELETE");
break;
case SHCNE_MKDIR:
strcpy(str,"SHCNE_MKDIR");
break;
case SHCNE_RMDIR:
strcpy(str,"SHCNE_RMDIR");
break;
case SHCNE_MEDIAINSERTED:
strcpy(str,"SHCNE_MEDIAINSERTED");
break;
case SHCNE_MEDIAREMOVED:
strcpy(str,"SHCNE_MEDIAREMOVED");
break;
case SHCNE_DRIVEREMOVED:
strcpy(str,"SHCNE_DRIVEREMOVED");
break;
case SHCNE_DRIVEADD:
strcpy(str,"SHCNE_DRIVEADD");
break;
case SHCNE_NETSHARE:
strcpy(str,"SHCNE_NETSHARE");
break;
case SHCNE_NETUNSHARE:
strcpy(str,"SHCNE_NETUNSHARE");
break;
case SHCNE_ATTRIBUTES:
strcpy(str,"SHCNE_ATTRIBUTES");
break;
case SHCNE_UPDATEDIR:
strcpy(str,"SHCNE_UPDATEDIR");
break;
case SHCNE_UPDATEITEM:
strcpy(str,"SHCNE_UPDATEITEM");
break;
case SHCNE_SERVERDISCONNECT:
strcpy(str,"SHCNE_SERVERDISCONNECT");
break;
case SHCNE_UPDATEIMAGE:
strcpy(str,"SHCNE_UPDATEIMAGE");
break;
case SHCNE_DRIVEADDGUI:
strcpy(str,"SHCNE_DRIVEADDGUI");
break;
case SHCNE_RENAMEFOLDER:
strcpy(str,"SHCNE_RENAMEFOLDER");
break;
case SHCNE_FREESPACE:
strcpy(str,"SHCNE_FREESPACE");
break;
default:
strcpy(str,"Unknown SHCNE!");
break;
}
}
careprad 2005-07-02
  • 打赏
  • 举报
回复
up
careprad 2005-07-02
  • 打赏
  • 举报
回复
谢谢两位,我想知道第五个参数为什么是1,它是干什么的


两位似乎监视的都是CSIDL_DESKTOP
我想应该是CSIDL_DRIVES吧,

TO :
idAnts(你才无聊呢) ( ) 信誉:110

您好像用的是VS.net,我其实是在C#里面调用这个API,您能看看我的程序吗?http://community.csdn.net/Expert/topic/4117/4117745.xml?temp=.1138422
Zhymax 2005-07-01
  • 打赏
  • 举报
回复
#include <windows.h>
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")

#define WM_SHNOTIFY WM_USER+1000


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WM_DESTROY:
PostMessage(hwnd,WM_QUIT,0,0);
break;
case WM_SHNOTIFY:
switch(lParam) {
case SHCNE_DRIVEREMOVED:
break;
case SHCNE_DRIVEADD:
break;
};
break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmd, int iCmdShow)
{
const TCHAR szAppName[] = TEXT("TEST");
HWND hwnd;
MSG msg;
WNDCLASS wc = {0};

ULONG hNotify;

wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = szAppName;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
if(!RegisterClass(&wc))
return 0;

hwnd = CreateWindow (szAppName, TEXT ("TEST"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;


SHChangeNotifyEntry shcne;
LPITEMIDLIST pidl;
if (NOERROR == SHGetSpecialFolderLocation(hwnd, CSIDL_DESKTOP, &pidl))
shcne.pidl = pidl; // Pointer to an item identifier list (PIDL) for which to receive notifications.
//Flag indicating whether to post notifications for children of this PIDL.
//For example, if the PIDL points to a folder, then file notifications would come from the folder's children if this flag was TRUE.
shcne.fRecursive = TRUE;

hNotify = SHChangeNotifyRegister(hwnd,
SHCNF_IDLIST | SHCNF_TYPE,
SHCNE_DRIVEREMOVED | SHCNE_DRIVEADD,
WM_SHNOTIFY,
1,
&shcne
);
if (hNotify == 0)
return 0;

ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg,0,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// Closes the notification handle returned from a call to SHChangeNotifyRegister.
SHChangeNotifyDeregister(hNotify);

return msg.wParam;
}

16,472

社区成员

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

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

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