|
Программирование >> Перегруженные имена функций и идентификаторы
NotIconD.hIcon=LoadIcon(hInst, MAINICON ); lstrcpyn(NotIconD.szTip,pszTip,sizeof(NotIconD.szTip)); Shell NotifyIcon(NIM ADD,&NotIconD); Для корректной работы функции предварительно нужно определить уникальный номер значка (параметр NotlconD.uID) и его сообщение (параметр NotlconD.uCallbackMessage). Делаем это в области определения глобальных переменных: #define MYWM NOTIFY (WM APP+100) #define IDC MYICON 1006 Сообщение значка будет обрабатываться в оконной процедуре главного окна (NotIconD.hWnd=MainWnd): case MYWM NOTIFY: if(lParam==WM RBUTTONUP) PostQuitMessage(0); break; Правый щелчок на значке - завершаем Этот код просто завершает работу приложения по щелчку правой кнопкой мыши на значке. При завершении работы значок надо удалить: void vfResetTrayIcon() { Удаляем значок Shell NotifyIcon(NIM DELETE,&NotIconD); Установка и снятие ловушек Для получения доступа в функциям ловушки надо определить указатели на эти функции: LRESULT CALLBACK ( stdcall *pKeybHook)(int,WPARAM,LPARAM); LRESULT CALLBACK ( stdcall *pMouseHook)(int,WPARAM,LPARAM); После этого спроецируем написанную DLL на адресное пространство процесса: hLib=LoadLibrary( SSHook.dll ); (hLib описан как HINSTANCE hLib) После этого мы должны получить доступ к функциям ловушек: (void*)pKeybHook=GetProcAddress(hLib, KeyboardHook ); (void*)pMouseHook=GetProcAddress(hLib, MouseHook ); Теперь всё готово к постановке ловушек. Устанавливаются они с помощью функции SetWindowsHookEx: hKeybHook=SetWindowsHookEx(WH KEYBOARD,(HOOKPROC)(pKeybHook),h Lib,0); hMouseHook=SetWindowsHookEx(WH MOUSE,(HOOKPROC)(pMouseHook), hLib,0); (hKeybHook и hMouseHook описаны как HHOOK hKeybHook; HOOK hMouseHook;) Первый параметр - тип ловушки (в данном случае первая ловушка для клавиатуры, вторая - для мыши). Второй - адрес процедуры ловушки. Третий - описатель DLL-библиотеки. Последний параметр - идентификатор потока, для которого будет установлена ловушка. Если этот параметр равен нулю (как в нашем случае), то ловушка устанавливается для всех потоков. После установки ловушек они начинают работать. При завершении работы приложения следует их снять и отключить DLL. Делается это так: UnhookWindowsHookEx(hKeybHook); UnhookWindowsHookEx(hMouseHook); Завершаем FreeLibrary(hLib); Функция WinMain Последний этап - написание функции WinMain в которой будет создаваться главное окно, устанавливаться значок в системную область панели задач, ставиться и сниматься ловушки. Код её должен быть примерно такой: WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) MSG msg; ---------------- hLib=LoadLibrary( SSHook.dll ); if(hLib) (void*)pKeybHook=GetProcAddress(hLib, KeyboardHook ); hKeybHook=SetWindowsHookEx(WH KEYBOARD,(HOOKPROC)(pKeybHook), hLib,0); Ставим ловушки (void*)pMouseHook=GetProcAddress(hLib, MouseHook ); hMouseHook=SetWindowsHookEx(WH MOUSE,(HOOKPROC)(pMouseHook), hLib,0); -------------------------------if (InitApplication(hInstance,nCmdShow)) Если создали главное окно vfSetTrayIcon(hInstance); Установили значок while (GetMessage(&msg,(HWND)(NULL),0,0)) { Цикл обработки сообщений TranslateMessage(&msg); DispatchMessage(&msg); --------- Всё - финал UnhookWindowsHookEx(hKeybHook); Снимаем ловушки UnhookWindowsHookEx(hMouseHook); FreeLibrary(hLib); Отключаем DLL vfResetTrayIcon(); Удаляем значок return 0; return 1; После написания этой функции можно смело запускать полностью готовое приложение.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |