我用鼠标钩子屏蔽鼠标遇到奇怪的问题,高手来帮帮忙,高分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);
没有执行的样子,为什么? 我的钩子是全局的,不是点击在那里都一样吗?
又不是完全不行,起码在全局上屏蔽了鼠标的部分功能,高手请指点一下!!

问题解决马上给分!!!
...全文
125 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
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

1,222

社区成员

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

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