====== Haki ======
===== Zadanie 1 =====
Utwórz program zakładający hak przechwytujący globalnie próbę zamknięcia dowolnego okna za pomocą skrótu klawiszowego ''Alt+F4''.
- Utwórz bibliotekę DLL eksportującą funkcje zakładające i zdejmujące hak typy WH_KEYBORD
- Zaimplementuj procedurę haka wychwytującą wciśnięcie klawisza F4 (VK_F4) i jednoczesne wciśnięcie lewego klawisza Alt (29 bit argumentu ''lParam'')
- Utwórz program, który ładuje bibliotekę DLL i zakłada hak globalny.
**Przydatne funkcje:**
* [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx|SetWindowsHookEx]] - instaluje hak \\ HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);
* [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644993%28v=vs.85%29.aspx|UnhookWindowsHookEx]] - usuwa hak BOOLUnhookWindowsHookEx(HHOOK hhk);
* [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx|KeyboardProc callback function]] \\ LRESULT KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
* [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx|CallNextHookEx]] - przesyła informacje do kolejnego haka w kolejce \\ LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);
===== Zadanie 2 =====
Utwórz program zakładający dwa haki pozwalające rejestrować i odtwarzać wykonane w systemie akcje.
- Utwórz bibliotekę DLL eksportującą funkcje zakładające i zdejmujące hak typy WH_JOURNALRECORD. Procedura haka ([[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644983%28v=vs.85%29.aspx|JournalRecordProc]]) wraz z akcją ''HC_ACTION'' dostarcza strukturę [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644966%28v=vs.85%29.aspx|EVENTMSG]], którą procedura powinna zachować np. w kolekcji vector z STL.
- Wyeksportuj z biblioteki funkcję zakładającą hak typu ''WH_JOURNALPLAYBACK''. Procedura haka ([[https://msdn.microsoft.com/en-us/library/windows/desktop/ms644982%28v=vs.85%29.aspx|JournalPlaybackProc]]) odtwarza akcje zapamiętane przez procedurę haka zapisującego. Dla akcji ''HC_GETNEXT'' należy podstawić zawartość odtwarzanej akcji do struktury EVENTMSG wskazywanej przez akgumrnt ''lParam'' a procedura powinna zwrócić odstęp czasu po jakim akcja ma być odtworzona.
- Utwórz program, który ładuje bibliotekę DLL i uruchamia nagrywanie po wciśnięciu klawisza F11 zaś uruchamia odtwarzanie po wciśnięciu klawisza F12.
**Przydatne funkcje:**
* [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms724408%28v=vs.85%29.aspx|GetTickCount]] ilość milisekund od startu systemu DWORD WINAPI GetTickCount(void);