nixp.ru v3.0

19 октября 2017,
четверг,
12:09:21 MSK

DevOps с компанией «Флант»
anonymous написал 17 января 2006 года в 16:32 (1110 просмотров) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

Написал программу, которая должна ловить все нажатия клавиш, с использованием 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();

}

//—————————————————————————

программа выдает ошибку, что «такой класс уже существует…» ну и тому подобное

Где я делаю не так??