高手请进:源码分析win2000下的键盘锁定
进行了以下的调用,但在win2000下却起不到锁定键盘的作用,不知何故?(win98下也不行)
#include <windows.h>
HHOOK OldHook=NULL;
HINSTANCE hInst=NULL;
int WINAPI DllEntryPoint(HINSTANCE hinst, DWORD dwReason, void*)
{
if (dwReason==DLL_PROCESS_ATTACH)
hInst = hinst;
else if(dwReason==DLL_PROCESS_DETACH)
if (OldHook)
UnhookWindowsHookEx(OldHook);
return 1;
}
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
return 1; //锁定任何按键。
}
BOOL _export CALLBACK DisableKB(bool disable)
{
if (disable) {
if (OldHook == NULL)
OldHook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)KeyProc, hInst, NULL);
return OldHook != NULL;
}
else {
if (OldHook && UnhookWindowsHookEx(OldHook))
OldHook = NULL;
return OldHook == NULL;
}
}
//在程序中调用------------------------------
bool (CALLBACK *DisableKB)(bool);
HINSTANCE DisableKBInst;
if ((DisableKBInst = LoadLibrary("hidkbdll.dll"))== NULL)
{
ShowMessage("错误:打开库文件失败!");
}
else
{
DisableKB = (bool(CALLBACK *)(bool))
GetProcAddress(DisableKBInst,"DisableKB");
if(DisableKB)
{
DisableKB(true);
ShowMessage("win200 键盘锁定!");
}
else
ShowMessage("错误:找不到DLL中的函数!");
}
FreeLibrary(DisableKBInst);
问题点数:100、回复次数:3Top
1 楼jishiping(JSP 季世平)回复于 2002-05-20 20:52:08 得分 70
这儿你加载DLL后,又马上释放DLL了。在DLL释放时,DLL又调用了UnhookWindowsHookEx,所以就不能锁定键盘了。所以应该在不需要锁定键盘的地方调用FreeLibrary(DisableKBInst);而不是在加载DLL后马上释放DLL。Top
2 楼aawolf(羌狼)回复于 2002-05-20 20:57:29 得分 30
void __fastcall TForm1::Button1Click(TObject *Sender)
{
oldkeyhook=SetWindowsHookEx(
WH_JOURNALRECORD,//截获键盘消息的钩子类型
(HOOKPROC)KeyboardProc, //钩子子程地址
//包含钩子子程的动态链接库的地址
//GetModuleHandle("hook.exe"),
HInstance,
//得到创建该窗口的线程的标识
0 );
if(oldkeyhook==NULL)
ShowMessage("Hook no good");
}
/*
*/
}Top
3 楼aawolf(羌狼)回复于 2002-05-20 21:01:11 得分 0
我写的是个日志钩子,但大体框架是一样的,SetWindowsHookEx和UnhookWindowsHookEx要在你的EXE里调用,而DLL是作为插入另外进程的部分,包含CALLBACK部分就对了。
你对钩子的概念还不太清楚。Top




