Написал программу, которая должна ловить все нажатия клавиш, с использованием DLL
вот исходник Dll:
#include
#define WM_MY_MESSAGE WM_USER + 133
extern LRESULT CALLBACK __export KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
extern LRESULT CALLBACK __export SetHook();
extern LRESULT CALLBACK __export UnHook();
HHOOK hKeybHook = NULL;
HINSTANCE hDLL;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hDLL = hinstDLL;
return 1;
}
extern LRESULT CALLBACK __export SetHook()
{
hKeybHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)(KeyboardProc), hDLL, 0);
if(hKeybHook == NULL)
MessageBox(NULL, «Can’t set the WH_KEYBOARD hook», «Info», MB_OK);
return 1;
}
extern LRESULT CALLBACK __export UnHook()
{
return UnhookWindowsHookEx(hKeybHook);
}
extern LRESULT CALLBACK __export KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if( nCode == HC_ACTION )
if( !((lParam>>31)&1) )
{
HWND hwnd = FindWindow(«TForm1», «MainForm»);
LPEVENTMSG lpEvent= (LPEVENTMSG)lParam;
PostMessage(hwnd, WM_MY_MESSAGE, lpEvent->paramH, (LPARAM)lpEvent);
}
return CallNextHookEx( hKeybHook, nCode, wParam, lParam);
}
А вот исходник программы (написана в среде CBUILDER 6)
#include
#pragma hdrstop
#include «Unit1.h»
#define WM_MY_MESSAGE WM_USER + 133
//—————————————————————————
#pragma package(smart_init)
#pragma resource «*.dfm»
TForm1 *Form1;
typedef LRESULT (CALLBACK *fnType)();
fnType sethookproc, unhookproc;
HMODULE hDLL = NULL;
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hDLL=LoadLibrary(«kbhook.dll»);
if(hDLL)
{
sethookproc = (fnType)GetProcAddress(hDLL,«SetHook»);
if(sethookproc)
sethookproc();
else
MessageBox(NULL, «Cant import SetHook», «Info», MB_OK);
hook:\n"+SysErrorMessage(GetLastError()));
}
else {ShowMessage(«Can’t load kbhook.dll»);exit(1);}
}
//—————————————————————————
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if( Msg.message == WM_MY_MESSAGE )
Memo1->Lines->Add(«New message!! :)»);
}
//—————————————————————————
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
unhookproc = (fnType)GetProcAddress(hDLL,«UnHook»);
if(unhookproc)
unhookproc();
}
//—————————————————————————
программа выдает ошибку, что «такой класс уже существует…» ну и тому подобное
Где я делаю не так??
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1