Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Слайд_ОС_ПМ / OS-Lection-7.ppt
Скачиваний:
35
Добавлен:
05.06.2014
Размер:
863.23 Кб
Скачать

ТИПИ ПАСТОК В ОС WINDOWS

Тип пастки

Опис

Область

 

 

видимості

WH_MOUSE

Цей тип пасток викликається при наявності повідомлень

Потік або вся

від миші після виклику функцій GetMessage або

система

PeekMessage. Подібно до пасток типу WH_KEYBOARD

 

фільтруючі функції отримують код HC_NOREMOVE

 

(індикатор видалення повідомлення з черги),

 

ідентифікатор повідомлення миші і координати x і y

 

курсора миші. В фільтруючій функції можна скасовувати

 

повідомлення. Фільтруючі функції повинні бути

 

реалізовані у динамічній бібліотеці.

 

WH_MSGFILTER Пастки цього типу викликаються в тому випадку, якщо

Потік або вся

діалогове вікно, інформаційне вікно, смуга прокрутки або

система

меню отримують повідомлення, або коли користувач

 

натискає комбінації клавіш ALT + TAB або ALT + ESC у

 

випадку, якщо додаток, що встановив пастку є активним.

 

Фільтруюча функція пасток цього типу отримує наступні

 

коди:

MSGF_DIALOGBOX,

MSGF_MENU,

 

MSGF_SCROLLBAR,

MSGF_NEXTWINDOW.

У

 

параметрі lParam передається покажчик на структуру,

 

яка містить інформацію про повідомлення.

 

 

 

11

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ТИПИ ПАСТОК В ОС WINDOWS

Тип пастки

Опис

Область

 

 

видимості

WH_SYSMSGFILTER

Цей тип пасток ідентичний типу WH_MSGFILTER, але

Тільки

 

він має системну область видимості. Пастки цього типу

система

 

викликаються в тому випадку, якщо діалогове вікно,

 

 

інформаційне вікно, смуга прокрутки або меню

 

 

отримують повідомлення, або коли користувач

 

 

натискає комбінації клавіш ALT + TAB або ALT + ESC.

 

 

Пастки цього типу викликаються раніше, ніж пастки

 

 

типу WH_MSGFILTER. Фільтруючі функції пасток цього

 

 

типу отримують ті ж коди, що і фільтруючі функції

 

 

пасток типу WH_MSGFILTER. У параметрі lParam

 

 

передається покажчик на структуру, яка містить

 

 

інформацію про повідомлення. Якщо будь-яка з

 

 

фільтруючих функцій пастки типу WH_SYSMSGFILTER

 

 

поверне TRUE, то пастки фільтруючої функції

 

 

WH_MSGFILTER не будуть викликані.

 

Як видно з таблиці деякі пастки можуть бути встановлені тільки з системною областю видимості, а деякі можна встановлювати як для всієї системи, так і для одного потоку.

12

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ТИПИ ПАСТОК В ОС WINDOWS

Пастки типу WH_JOURNALRECORD і WH_JOURNALPLAYBACK істотно відрізняються від пасток інших типів. Вони можуть встановлюватися лише як системні. Пастки цих типів впливають на всі програми Windows, включаючи робочий стіл. Побічним ефектом від використання пасток даного типу є те, що всі системні вхідні черги проходять через один потік, який встановив таку пастку. У Windows існує спеціальна послідовність дій, за допомогою якої користувач може видалити таку пастку в разі зависання системи. Для цього використовуються комбінації клавіш CTRL + ESC, ALT + ESC, або CTRL + ALT + DEL.

13

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

РОЗРОБКА ПАСТОК В ОС WINDOWS

Перейдемо до розгляду завдань пов'язаних безпосередньо з розробкою пасток. Для обробки повідомлень пишеться спеціальна функція (Hook Procedure). Якщо необхідно відстежувати повідомлення всіх потоків, а не тільки поточного, то пастка повинна бути глобальною. В цьому випадку функція пастки повинна знаходитися в динамічній бібліотеці DLL.

Завдання розробки програми з пасткою розбивається на наступні частини. 1.Написання DLL c функціями пастки.

2.Написання програми, яке встановить пастку. 3.Написання функції зняття пастки.

Розглянемо всі ці етапи на прикладі.

14

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ

// Описуємо сегмент Shared і змінні в цьому сегменті

#pragma data_seg(".shared")

extern "C" __declspec(dllexport) HHOOK g_KeyBoardHook = NULL; extern "C" __declspec(dllexport) HHOOK g_MouseHook = NULL;

#pragma data_seg()

extern "C" __declspec(dllexport) LRESULT __stdcall KeyboardHook( int nCode, WPARAM wParam, LPARAM lParam)

{// Функція пастки клавіатури

BOOL bControl = (BOOL) (::GetAsyncKeyState(VK_CONTROL) & 0x8000); if((wParam == 0x44) && bControl && !(lParam & 0x80000000))

{

MessageBox(NULL,"Были нажаты клавиши Ctrl+D", NULL, MB_OK);

}

if((wParam == 0x55) && bControl && (lParam & 0x80000000))

{

MessageBox(NULL,"Были нажаты клавиши Ctrl+U. Ловушки выгружены !", NULL, MB_OK);

// Завершуємо роботу пасток клавіатури і миші UnhookWindowsHookEx(g_KeyBoardHook); UnhookWindowsHookEx(g_MouseHook);

}

if((wParam == 0x4D) && bControl && (lParam & 0x80000000))

{

MessageBox(NULL,"Ctrl+M - Ловушка мыши отключена !", NULL, MB_OK); UnhookWindowsHookEx(g_MouseHook); // Завершуємо роботу пастки миші

}

return CallNextHookEx(g_KeyBoardHook, nCode, wParam, lParam);

}

15

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ(ПРОДОВЖЕННЯ)

extern "C" _declspec(dllexport) LRESULT __stdcall MouseHook(int nCode,

WPARAM wParam, LPARAM lParam)

{ // Функція пастки миші

if(wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE)

{

MOUSEHOOKSTRUCT* psMouseHook;

psMouseHook = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam); if(psMouseHook->pt.x==0 && psMouseHook->pt.y==0)

MessageBox(0,"Мышь в верхнем углу", "Внимание!", MB_ICONINFORMATION); return CallNextHookEx(g_MouseHook, nCode,wParam, lParam);

}

}

16

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ(ПРОДОВЖЕННЯ)

Для запобігання проблем пов'язаних з перетворенням імен функцій при їх експорті з бібліотеки на Visual С + + рекомендується в проект бібліотеки включати файл *. Def, в якому вказувати імена функцій, які повинні бути при експорті з бібліотеки. Приклад такого def файлу наведений нижче стосовно бібліотеки розглянутої у прикладі.

; LcsProvider.def : Declares the module parameters for the DLL.

LIBRARY "hookdll" EXPORTS

; Explicit exports can go here

KeyboardHook = KeyboardHook

MouseHook = MouseHook

17

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ДОДАТОК, ЯКИЙ ВСТАНОВЛЮЄ І ЗНІМАЄ

При розробці додатків з пастками програмаПАСТКИповинна вміти встановлювати, а потім знімати пастки. Встановлення пастки здійснюється за допомогою функції SetWindowsHookEx, а для

зняття пастки використовується функція UnhookWindowsHookEx.

//Опис змінних

HINSTANCE hLibrary; // Дескриптор бібліотеки

HOOKPROC pKeybHook; // Покажчик на процедуру обробки пастки клавіатури HOOKPROC pMousHook; // Покажчик на процедуру обробки пастки миші

//Покажчики на змінні сегмента Shared для передачі покажчиків на функції пастки

//клавіатури і миші

HHOOK *pKeyBoardHook;

HHOOK *pMouseHook;

MSG msg;

HWND hWnd=0; HACCEL hAccelTable;

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_HOOKDEMO, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HOOKDEMO); //Загрузка библиотеки и получение ее дескриптора

hLibrary=LoadLibrary("Hookdll.dll");

if(!hLibrary){

MessageBox(hWnd,"Невозможно загрузить библиотеку !", NULL, MB_OK|MB_ICONSTOP); 18 return 0;

}

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ДОДАТОК, ЯКИЙ ВСТАНОВЛЮЄ І ЗНІМАЄ

if(hLibrary){ pKeybHook=(HOOKPROC)GetProcAddress(hLibrary,"KeyboardHook");ПАСТКИ pMousHook=(HOOKPROC)GetProcAddress(hLibrary,"MouseHook");

// Получаем указатели на переменные в сегменте Shared pKeyBoardHook =(HHOOK*)GetProcAddress(hLibrary,"g_KeyBoardHook"); pMouseHook =(HHOOK*)GetProcAddress(hLibrary,"g_MouseHook");

*pKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,pKeybHook,hLibrary,0); if (!pKeyBoardHook)

if (!*pKeyBoardHook)

{

MessageBox(hWnd,"Невозможно загрузить функцию ловушки клавиатуры!", NULL, MB_OK);

PostQuitMessage (0); return 0;

}

*pMouseHook=SetWindowsHookEx(WH_MOUSE,pMousHook,hLibrary,0); if (!pMouseHook )

if (!*pMouseHook)

{

MessageBox(hWnd,"Невозможно загрузить функцию ловушки мыши!","",MB_OK);

PostQuitMessage (0); return 0;

}}

MessageBox(hWnd,"Ловушки загружены. (Ctrl+D)-Вызвать ловушку клавиатуры, (Ctrl+U)-Выгрузить все ловушки, (Ctrl+M)-Выгрузить ловушку мыши", "Message", MB_OK);

while (GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg); //дозволити використання клавіатури DispatchMessage(&msg); //повернути керування Windows

}

// Завершаем работу ловушек перед выходом из приложения UnhookWindowsHookEx(*pKeyBoardHook);

UnhookWindowsHookEx(*pMouseHook);

19

FreeLibrary(hLibrary);

// вивантажуємо бібліотеку

return (int) msg.wParam;

 

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

УСТАНОВКА ІКОНИ ПРОГРАМИ В СИСТЕМНУ

BOOL CTrayIconAPIDlg::AddTrayIcon() ОБЛАСТЬ

{

m_uRegisteredMessage=::RegisterWindowMessage(_T("TrayIcon_regMsg")); if(m_hTrayIcon)

::DestroyIcon(m_hTrayIcon);

if(!(m_hTrayIcon=::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SMALL_ICON)))) return FALSE;

this->GetWindowText(m_strTrayTipText); m_uID=1111;

NOTIFYICONDATA nid={0}; nid.cbSize=sizeof(NOTIFYICONDATA); nid.hWnd=m_hWnd;

nid.uID=m_uID;

nid.uFlags=NIF_MESSAGE | (m_hTrayIcon ? NIF_ICON : 0); nid.uCallbackMessage=m_uRegisteredMessage; nid.hIcon=m_hTrayIcon;

lstrcpyn(nid.szTip, m_strTrayTipText.GetBuffer(), 64); nid.uFlags |= NIF_TIP;

return (m_bAdded=::Shell_NotifyIcon(NIM_ADD, &nid));

}

BOOL CTrayIconAPIDlg::DeleteTrayIcon()

{

if(m_bAdded)

{NOTIFYICONDATA nid={0}; nid.cbSize=sizeof(NOTIFYICONDATA); nid.hWnd=m_hWnd;

nid.uID=m_uID;

return !(m_bAdded=!::Shell_NotifyIcon(NIM_DELETE, &nid));

}

20

return TRUE;

}

Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

Соседние файлы в папке Слайд_ОС_ПМ