|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Processing Commands and Messages from File Manager
The following code shows the FMExtensionProc function for a sample extension DLL. It demonstrates how an extension processes the menu commands and notification messages sent by File Manager.
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; switch (wMsg) { case FMEVENT_LOAD: #define lpload ((LPFMS_LOAD) lParam) /* Save the menu-item delta value. */ wMenuDelta = lpload->wMenuDelta; /* Fill the FMS_LOAD structure. */
lpload->dwSize = sizeof(FMS_LOAD); lstrcpy(lpload->szMenuName, "&Extension"); /* Return the handle of the menu. */ hinst = GetModuleHandle("ext.dll"); lpload->hMenu = GetSubMenu(LoadMenu(hinst, MAKEINTRESOURCE(MYMENU)), 0); return (LONG)TRUE; case FMEVENT_UNLOAD: /* Perform any cleanup procedures here. */ break; case FMEVENT_INITMENU: /* Copy the menu handle. */
hmenu = (HMENU) lParam; /* * Add check marks to menu items as appropriate. * Add menu-item delta values to menu-item * identifiers to specify the menu items to check. */ CheckMenuItem(hmenu, wMenuDelta + IDM_MULTIPLE, fMultiple ? 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}, }; /* Fill the FMS_TOOLBARLOAD structure. */ #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; /* * The following messages are generated when the user * chooses items from the extension menu. */ case FMEVENT_HELPSTRING:
#define lphs ((LPFMS_HELPSTRING)lParam) if (lphs->idCommand == -1) lstrcpy(lphs->szHelp, "Help for extension menu"); else wsprintf(lphs->szHelp, "Help for item %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) { /* * Selection indices are zero-based (0 is * first). */ count--; SendMessage(hwnd, FM_GETFILESEL, count, (LONG) (LPFMS_GETFILESEL) &file);
wsprintf(szBuf, "file %s\nSize %ld", (LPSTR) file.szName, file.dwSize); MessageBox(hwnd, szBuf, "File Information", MB_OK); if (!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; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Обработка Команд и Сообщений из Файлового Менеджера
Следующее кода показывает функцию FMExtensionProc для расширения образца DLL. Это демонстрирует как расширение обрабатывает команды меню и сообщения уведомления посылались Файловым Менеджером.
HINSTANCE hinst; HMENU hmenu; СЛОВО wMenuDelta; BOOL fMultiple = ЛОЖЬ; BOOL fLFN = ЛОЖЬ; ДОЛГО (ДЛИНОЙ) WINAPI FMExtensionProc(hwnd, wMsg, lParam) HWND hwnd; СЛОВО wMsg; ДОЛГО (ДЛИНОЙ) lParam; { СИМВОЛ szBuf[200]; СЧЕТ INT; ключ (wMsg) { случай FMEVENT_LOAD: #define lpload ((LPFMS_LOAD) lParam) /* Сохраните меню-пункт дельты value. */ wMenuDelta = lpload->wMenuDelta; /* Заполните structure. FMS_LOAD */
lpload->dwSize = sizeof(FMS_LOAD); lstrcpy(lpload->szMenuName, "&Расширение"); /* Возвращайте ручку menu. */ hinst = GetModuleHandle("ext.dll"); lpload->hMenu = GetSubMenu(LoadMenu(hinst, MAKEINTRESOURCE(MYMENU)), 0); возврат (LONG)TRUE; случай FMEVENT_UNLOAD: /* Выполните любые процедуры очистки here. */ прерывание; случай FMEVENT_INITMENU: /* Скопируйте меню handle. */
hmenu = (HMENU) lParam; /* * Добавьте контрольные отметки к пунктам меню как подходящий. * Добавьте меню-пункт величин дельты к меню-пункту * идентификаторы, чтобы определять пункты меню, чтобы проверяться. */ CheckMenuItem(hmenu, wMenuDelta + IDM_MULTIPLE, fMultiple? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hmenu, wMenuDelta + IDM_LFN,
fLFN? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED); прерывание; случай FMEVENT_TOOLBARLOAD: { статический EXT_BUTTON extbtn[] = { {1, 0, 0}, }; /* Заполните structure. 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; возврат (LONG)TRUE; } случай FMEVENT_USER_REFRESH: MessageBox(hwnd, "событие восстановления Пользователя", "Эй!", MB_OK); прерывание; случай FMEVENT_SELCHANGE: прерывание; /* * Следующие сообщения сгенерированы когда пользователь * пункты выборов из меню расширения. */ случай FMEVENT_HELPSTRING:
#define lphs ((LPFMS_HELPSTRING)lParam) если (lphs->idCommand == -1) lstrcpy(lphs->szHelp, "Подсказка для меню расширения"); еще wsprintf(lphs->szHelp, "Подсказка для пункта %d", lphs->idCommand); прерывание; случай FMEVENT_HELPMENUITEM: wsprintf(szBuf, "Подсказка для %d", lParam); MessageBox(hwnd, szBuf, "ВЫЗОВ WinHelp", MB_OK); /* * Использование: WinHelp(hwnd, "ExtHelp.hlp", HELP_CONTEXT, lParam);
*/ прерывание; случай IDM_GETFOCUS: wsprintf(szBuf, "Фокус %d", (INT) SendMessage(hwnd, FM_GETFOCUS, 0, 0)); MessageBox(hwnd, szBuf, "ФОКУС", MB_OK); прерывание; случай IDM_GETCOUNT: считать = (INT) SendMessage(hwnd, fLFN? FM_GETSELCOUNTLFN : FM_GETSELCOUNT, 0, 0); wsprintf(szBuf, "%d файлы выбирались", счет); MessageBox(hwnd, szBuf, "СЧЕТ Выбора", MB_OK);
прерывание; случай IDM_GETFILE: { файл FMS_GETFILESEL; считать = (INT) SendMessage(hwnd, fLFN? FM_GETSELCOUNTLFN : FM_GETSELCOUNT, FMFOCUS_DIR, 0); пока (счет >= 1) { /* * Индексы Выбора основаны нуль (0 * сначала). */ счет--; SendMessage(hwnd, FM_GETFILESEL, СЧЕТ, (ДОЛГО (ДЛИНОЙ)) (LPFMS_GETFILESEL) &файл);
wsprintf(szBuf, "файл %s\nSize %ld", (LPSTR) file.szName, file.dwSize); MessageBox(hwnd, szBuf, "ФАЙЛОВАЯ Информация", MB_OK); если прерывание (!fMultiple); } прерывание; } случай IDM_GETDRIVE: { накопитель FMS_GETDRIVEINFO; SendMessage(hwnd, FM_GETDRIVEINFO, 0, (ДОЛГО (ДЛИНОЙ)) (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, "НАКОПИТЕЛЬ Инфо", MB_OK); прерывание; } случай IDM_LFN: MessageBox(hwnd, "IDM_LFN", "ПРИВЕТ", MB_OK); fLFN = !fLFN; прерывание; случай IDM_MULTIPLE: MessageBox(hwnd, "IDM_MULTIPLE", "ПРИВЕТ", MB_OK); fMultiple = !fMultiple; прерывание; случай IDM_REFRESH:
случай IDM_REFRESHALL: SendMessage(hwnd, FM_REFRESH_WINDOWS, wMsg == IDM_REFRESHALL, 0); прерывание; случай IDM_RELOAD: PostMessage(hwnd, FM_RELOAD_EXTENSIONS, 0, 0); прерывание; } возвращайте 0L; }
|
|
|
|
| |