以下代码显示了示例扩展DLL的FMExtensionProc函数。它演示了扩展程序如何处理文件管理器发送的菜单命令和通知消息。
HINSTANCE hinst;
HMENU hmenu;
WORD wMenuDelta;
BOOL fMultiple = FALSE;
BOOL fLFN = FALSE;
LONG WINAPI FMExtensionProc(hwnd,wMsg,lParam)
HWND hwnd;
WORD wMsg;
LONG lParam;
{
CHAR szBuf[200];
INT count;
开关(wMsg){
case FMEVENT_LOAD:
#define lpload((LPFMS_LOAD)lParam)
/ *保存菜单项增量值。*/
wMenuDelta = lpload->wMenuDelta;
/ *填写FMS_LOAD结构。*/
lpload->dwSize = sizeof(FMS_LOAD);
lstrcpy(lpload->szMenuName, "&Extension");
/ *返回菜单的句柄。*/
hinst = GetModuleHandle("ext.dll");
lpload->hMenu = GetSubMenu(LoadMenu(hinst,
MAKEINTRESOURCE(MYMENU)), 0);
return (LONG)TRUE;
case FMEVENT_UNLOAD:
/ *在这里执行任何清理程序。*/
break;
case FMEVENT_INITMENU:
/ *复制菜单句柄。*/
hmenu = (HMENU) lParam;
/*
*根据需要将选中标记添加到菜单项。
*将菜单项增量值添加到菜单项
*标识符来指定要检查的菜单项。
*/
CheckMenuItem(hmenu,
wMenuDelta + IDM_MULTIPLE,
多元吗MF_BYCOMMAND | MF_CHECKED:
MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(hmenu,
wMenuDelta + IDM_LFN,
fLFN? MF_BYCOMMAND | MF_CHECKED:
MF_BYCOMMAND | MF_UNCHECKED);
break;
case FMEVENT_TOOLBARLOAD:
{
static EXT_BUTTON extbtn[] = {
{1, 0, 0},
};
/ *填写FMS_TOOLBARLOAD结构。*/
#define lptbld((LPFMS_TOOLBARLOAD)lParam)
lptbld->dwSize = sizeof(FMS_TOOLBARLOAD);
lptbld->lpButtons = (LPEXT_BUTTON) &extbtn;
lptbld->cButtons = 1;
lptbld->cBitmaps = 1;
lptbld->idBitmap = ID_BUTTONBITMAP;
return (LONG)TRUE;
}
case FMEVENT_USER_REFRESH:
MessageBox(hwnd,“User refresh event”,
"Hey!", MB_OK);
break;
case FMEVENT_SELCHANGE:
break;
/*
*用户生成以下消息
*从扩展菜单中选择项目。
*/
case FMEVENT_HELPSTRING:
#define lphs((LPFMS_HELPSTRING)lParam)
if (lphs->idCommand == -1)
lstrcpy(lphs->szHelp, "Help for extension menu");
其他
wsprintf(lphs- > szHelp,“项目%d的帮助”,lphs- > idCommand);
break;
case FMEVENT_HELPMENUITEM:
wsprintf(szBuf, "Help for %d", lParam);
MessageBox(hwnd, szBuf, "WinHelp call", MB_OK);
/*
* Use: WinHelp(hwnd, "ExtHelp.hlp", HELP_CONTEXT, lParam);
*/
break;
case IDM_GETFOCUS:
wsprintf(szBuf,“Focus%d”,
(INT) SendMessage(hwnd, FM_GETFOCUS, 0, 0));
MessageBox(hwnd, szBuf, "Focus", MB_OK);
break;
case IDM_GETCOUNT:
count = (INT) SendMessage(hwnd,
fLFN? FM_GETSELCOUNTLFN:FM_GETSELCOUNT,
0, 0);
wsprintf(szBuf, "%d files selected", count);
MessageBox(hwnd, szBuf, "Selection Count", MB_OK);
break;
case IDM_GETFILE:
{
FMS_GETFILESEL file;
count = (INT) SendMessage(hwnd,
fLFN? FM_GETSELCOUNTLFN:FM_GETSELCOUNT,
FMFOCUS_DIR,
0);
while (count >= 1) {
/*
*选择索引为零(0为
*第一)。
*/
count--;
SendMessage(hwnd,FM_GETFILESEL,count,
(LONG) (LPFMS_GETFILESEL) &file);
wsprintf(szBuf,“%s \\ nSize%ld”,
(LPSTR) file.szName, file.dwSize);
MessageBox(hwnd,szBuf,“文件信息”,
MB_OK);
如果(!fMultiple)
break;
}
break;
}
case IDM_GETDRIVE:
{
FMS_GETDRIVEINFO drive;
SendMessage(hwnd,FM_GETDRIVEINFO,0,
(LONG) (LPFMS_GETDRIVEINFO)&drive);
wsprintf(szBuf,
“%s \\ nFree%ld \\ nTotal%ld \\ nVolume%s \\ nShare%s”,
(LPSTR)drive.szPath,drive.dwFreeSpace,
drive.dwTotalSpace,(LPSTR)drive.szVolume,
(LPSTR) drive.szShare);
MessageBox(hwnd, szBuf, "Drive Info", MB_OK);
break;
}
case IDM_LFN:
MessageBox(hwnd, "IDM_LFN", "Hi", MB_OK);
fLFN = !fLFN;
break;
case IDM_MULTIPLE:
MessageBox(hwnd, "IDM_MULTIPLE", "Hi", MB_OK);
fMultiple = !fMultiple;
break;
case IDM_REFRESH:
case IDM_REFRESHALL:
SendMessage(hwnd,FM_REFRESH_WINDOWS,
wMsg == IDM_REFRESHALL, 0);
break;
case IDM_RELOAD:
PostMessage(hwnd, FM_RELOAD_EXTENSIONS, 0, 0);
break;
}
return 0L;
}