从文件管理器处理命令和消息

【勇芳软件工作室】汉化HomePreviousNext

以下代码显示了示例扩展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;

}