|
Программирование >> Перегруженные имена функций и идентификаторы
анализируется значение параметра wParam, а для отслеживания координат значение, находящееся в структуре типа MOUSEHOOKSTRUCT, на которую указывает lParam. Код, реализующий вышесказанное, примерно такой: LRESULT CALLBACK MouseHook(int nCode,WPARAM wParam,LPARAM lParam) { Ловушка мыши - включает хранитель когда в углу if(wParam==WM MOUSEMOVE wParam==WM NCMOUSEMOVE) psMouseHook=(MOUSEHOOKSTRUCT*)(lParam); if(psMouseHook->pt.x==0 && psMouseHook->pt.y==0) if(bSCRSAVEACTIVE) PostMessage(psMouseHook->hwnd,WM SYSCOMMAND, SC SCREENSAVE,0); return 0; Обратите внимание, что команда на активизацию хранителя посылается в окно, получающее сообщения от мыши: PostMessage(psMouseHook->hwnd,WM SYSCOMMAND, SC SCREENSAVE ,0). Теперь, когда функции ловушек написаны, надо сделать так, чтобы они были доступны из процессов, подключающих эту библиотеку. Для этого перед функцией входа следует добавить такой код: extern C declspec(dllexport) LRESULT CALLBACK KeyboardHook(int,WPARAM,LPARAM); extern C declspec(dllexport) LRESULT CALLBACK MouseHook(int,WPARAM,LPARAM); Написание приложения, устанавливающего ловушку Создание пустого приложения Для создания пустого приложения воспользоваться встроенным мастером. Для этого надо использовать пункт меню File New: В появившемся окне необходимо выбрать Console Wizard и нажать кнопку Ok . В новом диалоге в разделе Source Type следует оставить значение по умолчанию - C++ . Во втором разделе надо снять все флажки. По нажатию Ок приложение создаётся. Создание главного окна Следующий этап - это создание главного окна приложения. Сначала надо зарегистрировать класс окна. После этого создать окно. Всё это делает следующий код (описатель окна MainWnd определён глобально): BOOL InitApplication(HINSTANCE hinstance,int nCmdShow) { Создание главного окна WNDCLASS wcx; Класс окна wcx.style=NULL; wcx.lpfnWndProc=MainWndProc; wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hInstance=hinstance; wcx.hIcon=LoadIcon(hinstance, MAINICON ); wcx.hCursor=LoadCursor(NULL,IDC ARROW); wcx.hbrBackground=(HBRUSH)(COLOR APPWORKSPACE); wcx.lpszMenuName=NULL; wcx.lpszClassName= HookWndClass ; if(RegisterClass(&wcx)) Регистрируем класс MainWnd=CreateWindow( HookWndClass , SSHook , /* Создаём окно */ WS OVERLAPPEDWINDOW, CW USEDEFAULT,CW USEDEFAULT, CW USEDEFAULT,CW USEDEFAULT, NULL,NULL,hinstance,NULL); if(!MainWnd) return FALSE; return TRUE; return false; Обратите внимание на то, каким образом был получен значок класса: wcx.hIcon=LoadIcon(hinstance, MAINICON ); Для того, чтобы это получилось надо включить в проект фай ресурсов (*.res), в котором должен находиться значок с именем MAINICON . Это окно никогда не появится на экране, поэтому оно имеет размеры и координаты, устанавливаемые по умолчанию. Оконная процедура такого окна необычайно проста: LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam) { Оконная процедура switch (uMsg) case WM DESTROY:{PostQuitMessage(0); break;} case MYWM NOTIFY: if(lParam==WM RBUTTONUP) PostQuitMessage(0); break; Правый щелчок на значке - завершаем default: return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0; Размещение значка в системной области Возникает естественный вопрос: если окно приложения никогда не появится на экране, то каким образом пользователь может управлять им (например, закрыть)? Для индикации работы приложения и для управления его работой поместим значок в системную область панели задач. Делается это следующей функцией: void vfSetTrayIcon(HINSTANCE hInst) { Значок в Tray char* pszTip= Хранитель экрана и раскладка ; Это просто Hint NotIconD.cbSize=sizeof(NOTIFYICONDATA); NotIconD.hWnd=MainWnd; NotIconD.uID=IDC MYICON; NotIconD.uFlags=NIF MESSAGENIF ICONNIF TIP; NotIconD.uCallbackMessage=MYWM NOTIFY;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |