EXE файл загрузчик:
#include <Windows.h>
#include <windowsx.h>
#include "Header.h"
HMODULE hHookDll = NULL;
BOOL(CALLBACK* SetKeyboardHook)();
VOID(CALLBACK* UnhookKeyboardHook)();
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
hHookDll = LoadLibrary(TEXT("dll.dll"));
if (hHookDll) {
MessageBox(NULL, L"Downloading chkcng", NULL, MB_OK);
(FARPROC&)SetKeyboardHook = GetProcAddress(hHookDll, "SetKeyboardHook");
(FARPROC&)UnhookKeyboardHook = GetProcAddress(hHookDll, "UnhookKeyboardHook");
}
wchar_t szClassName[] = L"Main";
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.style = CS_VREDRAW; //Вывод относительно нижней границы рабочей области
wc.lpfnWndProc = WndProc;
wc.lpszClassName = szClassName;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
wc.lpszMenuName = L"Main";
RegisterClass(&wc);
MessageBox(NULL, L"Window create success", L"DASDASD", MB_OK);
HWND hwnd = CreateWindow(szClassName, L"Hook", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, HWND_DESKTOP, NULL, hInst, NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
default:
return(DefWindowProc(hwnd, msg, wParam, lParam));
}
}
void OnDestroy(HWND)
{
PostQuitMessage(0);
}
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
switch (id)
{
case MI_OPEN:
MessageBox(NULL, L"SetKeyboardFunc", NULL, MB_OK);
SetKeyboardHook();
break;
case MI_EXIT:
MessageBox(NULL, L"выход из приложения", L"DASDASD", MB_OK);
UnhookKeyboardHook();
FreeLibrary(hHookDll);
DestroyWindow(hwnd);
break;
}
}
Заголовочный файл EXE:
#pragma once
#define MI_OPEN 101
#define MI_EXIT 102
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void OnCommand(HWND, int, HWND, UINT);
void OnDestroy(HWND);
Исходный код DLL (dll.cpp
):
#include "dllheader.h"
HHOOK hKeyBoardHook = NULL; //наш хук
HINSTANCE hCurrentDll = NULL; //дескриптор этой длл
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved) {
switch (dwReason) {
case DLL_PROCESS_ATTACH:
MessageBoxA(NULL, "DLL ATTACH", "DASDASD", MB_OK);
hCurrentDll = hDll;
break;
}
return (TRUE);
}
LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam) {
if (code == HC_ACTION) {
wchar_t bykv[64] = { 0 };
GetKeyNameText(lParam, bykv, sizeof(bykv));
//wsprintf(bykv, L"0x%X", wParam);
MessageBox(NULL, bykv, NULL, MB_OK);
}
return CallNextHookEx(hKeyBoardHook, code, wParam, lParam);
}
BOOL CALLBACK SetKeyboardHook() {
if (!hKeyBoardHook) { //если хук не установлен
MessageBoxA(NULL, "SetWindowsHook", "DASDASD", MB_OK);
hKeyBoardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyBoardProc, hCurrentDll, 0);
}
return TRUE;
}
VOID CALLBACK UnhookKeyboardHook() {
MessageBox(NULL, L"UnhookKeyboardHook", L"DASDASD", MB_OK);
if (hKeyBoardHook) {
UnhookWindowsHookEx(hKeyBoardHook);
hKeyBoardHook = NULL;
}
}
Заголовочный файл DLL (dllheader.h
):
#pragma once
#include <windows.h>
#include <iostream>
Файл .def
:
LIBRARY Hook
EXPORTS
SetKeyboardHook @1
UnhookKeyboardHook @2