MyHookDll.h
| Код | #define MYHOOKDLL_API __declspec(dllexport)
#include <windows.h>
extern "C" { MYHOOKDLL_API int SetHook( HWND,UINT ); MYHOOKDLL_API int UnSetHook(); }
|
MyHookDll.cpp
| Код |
#include "MyHookDll.h"
// Глобальные переменные HINSTANCE hInstance = NULL; // The instance of the DLL
// Описание нашей хук-функци LRESULT CALLBACK KeyboardMsgProc ( int, WPARAM, LPARAM );
#pragma data_seg(".SData") HHOOK hMsgHook = NULL; // Handle нашего хука UINT KBoardMessage = NULL; // Сообщение, которое мы будем посылать // родительскому приложению HWND hParentWnd = NULL; // Окно родительского приложения #pragma data_seg( )
//Директива линкеру создать разделяемую(shared) секцию с атрибутами RWS #pragma comment(linker,"/SECTION:.SData,RWS")
// Далее, обычная DllMain BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) hInstance = (HINSTANCE)hModule;
return TRUE; }
// Две функции SetHook и UnsetHook
MYHOOKDLL_API int SetHook (HWND hWnd, // window which // should receive notification messages UINT UpdateMsg) // notification message { if (hWnd == NULL) return -1; // Save received parameters hParentWnd = hWnd; KBoardMessage = UpdateMsg; // Set hook hMsgHook= ::SetWindowsHookEx (WH_GETMESSAGE, KeyboardMsgProc, hInstance, 0); // If we are failed... if (hMsgHook == NULL) return -1; return 0; };
MYHOOKDLL_API int UnSetHook() { UnhookWindowsHookEx (hMsgHook); hMsgHook = NULL; return 0; };
LRESULT CALLBACK KeyboardMsgProc (int code, WPARAM wParam, LPARAM lParam) { if (code >= 0) { MSG * msg = (MSG * )lParam;
if ((lParam) &&(msg->message == WM_CHAR) &&(wParam == PM_REMOVE)) PostMessage (hParentWnd, KBoardMessage, msg->wParam, 0 ); }
return CallNextHookEx (hMsgHook, code ,wParam , lParam); };
|
ИЗИНЯЮСЬ, что не дал ссылку, статья у меня на компе, она с сайта http://www.uinc.ru/
Только тут идёт только перехват символов, изменяй на WM_KEYDOWN, а вообще найди статью на www.uinc.ru - там это подробно описанно, может поможет |