Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 155 156 157 [ 158 ] 159 160 161 ... 210


анализируется значение параметра 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;



1 ... 155 156 157 [ 158 ] 159 160 161 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика