真没想到,写个键盘HOOK就居然碰到这样的难题!烦各位大侠看一看!

sunboy 2000-05-07 05:55:00
我想作一个键盘HOOK,用BCB5作了一个KEY.DLL,原程序如下:

extern "C" __declspec(dllexport) int __stdcall StartKeyHook(void);
extern "C" __declspec(dllexport) int __stdcall StopKeyHook(void);

LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam);

static HANDLE hInstance;
static HHOOK hKeyHook = 0;


int __stdcall StartKeyHook()
{

if(hKeyHook) return 1;
hKeyHook=SetWindowsHookEx(WH_KEYBOARD,KeyHook,hInstance,0);
return 0;
}

int __stdcall StopKeyHook()
{
if(hKeyHook)
{
UnhookWindowsHookEx(hKeyHook);
hKeyHook = 0;
}
return 0;
}

LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam)
{
if(nCode>=0)
{
return 1;
}
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}

用BCB5作了一个应用来调用该DLL,该应用包含一个编辑框,两个按钮,一个用于START
KEYHOOK,一个用于STOP KEYHOOK,在未START KEYHOOK时,编辑框和NOTEPAD都
可输入字符,但START KEYHOOK后,编辑框不能输入字符是正常的,但在NOTEPAD中,
只要一敲键盘,系统就告诉我出现严重错误,我想该KEYHOOK在DLL中已用
SetWindowsHookEx函数声明是全局性的,为什么还出错?请各位高手指教!谢谢!
...全文
261 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2001-04-29
  • 打赏
  • 举报
回复
这程序的目的是让键盘失效,我写过类似的程序,没有问题的。
halfdream 2000-05-13
  • 打赏
  • 举报
回复
sunboy程序问题应该就是出在把 HOOK调用链条搞断了。因为后面notepad还会用到。
HOOKPROC中,CallNextHookEx几乎是必须要执行的。

就在这网站上
(http://www.csdn.net/Delphi/index.htm)
上面就有一个键盘HOOK的例子,DELPHI写的,可供参考一下。
Midi 2000-05-12
  • 打赏
  • 举报
回复
是这一段改变的:
EVENTMSG *myevt=(EVENTMSG *)lParam;
if(myevt->message==WM_KEYDOWN)
{
myevt->paramL=0; //改变键盘消息
}
Iwant 2000-05-10
  • 打赏
  • 举报
回复
myHook = NULL;,为什么要把消息连清了?????
Midi 2000-05-09
  • 打赏
  • 举报
回复
键盘的消息在hook程序处理后根本没改变,继续传下去。
看下面的程序,虽然外边程序也能锁住,但用户按ctrl+alt+del
后就会失效,很奇怪。

HOOKPROC myProc(int iCode,WPARAM wParam, LPARAM lParam)
{
EVENTMSG *myevt=(EVENTMSG *)lParam;
if(myevt->message==WM_KEYDOWN)
{
myevt->paramL=0; //改变键盘消息
}
return (HOOKPROC)CallNextHookEx(myHook,iCode,wParam,lParam);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
myHook = SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)myProc,HInstance,0);
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(myHook)
{
UnhookWindowsHookEx(myHook);
myHook = NULL;
}
}
//------------------------------------------------------------------------

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧