我用鼠标钩子屏蔽鼠标遇到奇怪的问题,高手来帮帮忙,高分100!!

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//若已经挂上Hook链,则检测鼠标信息
if(nCode >= HC_ACTION ){
switch(wParam){
case WM_LBUTTONDOWN:
::UnhookWindowsHookEx(hHook);
MoveLine();//自定义的函数
return 1;
case WM_RBUTTONDOWN:
::UnhookWindowsHookEx(hHook);
MoveLine();
return 1;
case WM_MOUSEMOVE:
funs(); //自定义的函数
return 0;
//case WM_LBUTTONUP:
//::UnhookWindowsHookEx(hHook);
// MoveLine();
// return 1;
//case WM_RBUTTONUP:
//::UnhookWindowsHookEx(hHook);
// MoveLine();
// return 1;
default:
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
}
else{
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
}


上面那里有问题?鼠标是屏蔽了,但是本来按键后,就要卸掉钩子的,可是不会,只有击在Form1上才会,击在桌面上就不会,好像是::UnhookWindowsHookEx(hHook);
没有执行的样子,为什么? 我的钩子是全局的,不是点击在那里都一样吗?
又不是完全不行,起码在全局上屏蔽了鼠标的部分功能,高手请指点一下!!

问题解决马上给分!!!
...全文
49 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
constantine 2003-11-19
  • 打赏
  • 举报
回复
帮你UP
dreamshadow 2003-11-04
  • 打赏
  • 举报
回复
卸载钩子的时候为什么不调用DLL中的UninstallHook()函数呢?
不需要用这个:
UnhookWindowsHookEx(hHook);
hHook好象没定义过吧!
nightfallrove 2003-11-03
  • 打赏
  • 举报
回复
也许是DLL中的全局变量没有处理好,
只能传递FORM!中传过去的变量,
看一下这个贴会不会对你有点帮助
http://expert.csdn.net/Expert/topic/1563/1563192.xml?temp=.619671
freshman2003 2003-11-01
  • 打赏
  • 举报
回复
需要搞明白点击桌面系统会不会发出WM_LBUTTONDOWN消息,要是只有点击窗体时才发送WM_LBUTTONDOWN消息的话,你的钩子就卸载不了了。你设置一个断点试试。
sprewellkobe 2003-11-01
  • 打赏
  • 举报
回复
#include <windows.h>
//---------------------------------------------------------------------------
// Important note about DLL memory management when your DLL uses the
// static version of the RunTime Library:
//
// If your DLL exports any functions that pass String objects (or structs/
// classes containing nested Strings) as parameter or function results,
// you will need to add the library MEMMGR.LIB to both the DLL project and
// any other projects that use the DLL. You will also need to use MEMMGR.LIB
// if any other projects which use the DLL will be performing new or delete
// operations on any non-TObject-derived classes which are exported from the
// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases,
// the file BORLNDMM.DLL should be deployed along with your DLL.
//
// To avoid using BORLNDMM.DLL, pass string information using "char *" or
// ShortString parameters.
//
// If your DLL uses the dynamic version of the RTL, you do not need to
// explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------

#pragma argsused
HINSTANCE DllH;
HHOOK hook;
const WM_MYMESSAGE=WM_USER+1;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
DllH=hinst;
return 1;
}
//---------------------------------------------------------------------------


__declspec(dllexport) LRESULT CALLBACK WindowProc(int n,WPARAM wp,LPARAM lp);
extern "C" __declspec(dllexport) bool __stdcall InstallHook(void);
extern "C" __declspec(dllexport) bool __stdcall UninstallHook(void);

//---------------------------------------------------------------------------

bool __stdcall InstallHook()
{
if(!hook)
{hook=SetWindowsHookEx(WH_CALLWNDPROC,HOOKPROC(WindowProc),DllH,0);
if(hook)
return true;}
return false;
}

//---------------------------------------------------------------------------

bool _stdcall UninstallHook()
{
if(hook)
{UnhookWindowsHookEx(hook);
hook=0;
return true;}
return false;
}

//----------------------------------------------------------------------------

LRESULT CALLBACK WindowProc(int n,WPARAM wp,LPARAM lp)
{
if(n<0)
{CallNextHookEx(hook,n,wp,lp);
return 0;}
if(n==HC_ACTION)
{
CWPSTRUCT *infor;
infor=(CWPSTRUCT*)lp;
HWND AimWin,PreWin;
AimWin=infor->hwnd;

if(infor->message==WM_ACTIVATEAPP)
{
bool ma;
ma=bool(infor->wParam);

if(ma)
{
//PreWin=HWND(infor->lParam);

HWND HomeApp;
HomeApp=FindWindow(NULL,"abc");
if(HomeApp)
{
SendMessage(HomeApp,WM_MYMESSAGE,WPARAM(1),LPARAM(AimWin));

}
}
else if(ma==false)
{
HWND HomeApp;
HomeApp=FindWindow(NULL,"abc");
if(HomeApp)
{
SendMessage(HomeApp,WM_MYMESSAGE,WPARAM(0),LPARAM(AimWin));
}
}
}

}
return int(CallNextHookEx(hook,n,wp,lp));
}

dll实现的例子
zihan 2003-11-01
  • 打赏
  • 举报
回复
同意楼上的,要使用全局钩子,不然你点击桌面怎么会接收到呢??

就是做成一个dll就可以了。
  • 打赏
  • 举报
回复
是DLL啊,不然就不会在整个桌面都有反映了,但是卸载就只能点机Form1了,不知道为什么?
不过有的函数我是在.h中定义的,有关系吗?头文件里面还定义了其他变量,用来处理又
Application传递过来的参数的.我试过了,这些都可以,就是在卸载钩子时不行,必须是点在
form1上,不知道怎么办才好??
佣工7001 2003-10-31
  • 打赏
  • 举报
回复
你使用dll实现的吗?
否则不是全局的
constantine 2003-10-31
  • 打赏
  • 举报
回复
不知道,帮你UP

1,220

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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