Klase - mač sa dve oštrice. Pored svih prednosti organizovanja koda i svega ostalog, onaj koje navikao na line-after-line programiranje u BASICU, pascalu ili C-u ima velike poteškoće da nauči kako se koriste klase...
Bacio sam dosta $ za VC++ 6 da bih odradio jedan komer. projekat, a posle par dana naiđoh na problem.
Pošto sam napisao dosta koda, problem je nastao u preglednosti koda. Rekoh sebi: ajde da se malo pozabavim sa klasama... Tu počinje pakao...
Maksimalno sam pojednostavio projekat, tj. izdvojio sam jedan deo da bi mogli da mi pomognete.
hook.h:
class hook{
public:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
};
hook.cpp:
#define _WIN32_WINNT 0x0400
#include "Windows.h"
#include "hooking.h"
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
WPARAM wParam, LPARAM lParam) {
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) &&
((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) &
0x8000) != 0));
break;
}
}
if(fEatKeystroke)
MessageBox(NULL,NULL,NULL,NULL);
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,
lParam));
}
};
main.cpp:
#define _WIN32_WINNT 0x0400
#include <Windows.h>
#include "hooking.h"
void OnTop();
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, hook::LowLevelKeyboardProc, hinstExe, 0);
MessageBox(NULL,
TEXT("System combination of keys is disabled.\n")
TEXT("Click OK to terminate this application and enable combinations"),
TEXT("Try to press ALT-TAB, CTRL-ESC or ALT-ESC!"), MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}
void OnTop()
{
MessageBox(NULL,
TEXT("You have pressed forbiden combination!\n")
TEXT("Click OK to close this message box"),
TEXT("Forbiden!"), MB_OK);
}
Poruka o grešci:
--------------------Configuration: hook - Win32 Debug--------------------
Compiling...
main.cpp
c:\frogProject\ES\main.cpp(9) : error C2664: 'SetWindowsHookExA' : cannot convert
parameter 2 from 'long (__stdcall hook::*)(int,unsigned int,long)' to
'long (__stdcall *)(int,unsigned int,long)'
There is no context in which this conversion is possible
Skipping... (no relevant changes detected)
hooking.cpp
Error executing cl.exe.
hook.exe - 1 error(s), 0 warning(s)