钩子高手们,关于鼠标键盘钩子的超级重大问题!!

yuanreid 2002-10-01 06:54:56
我自己写了一个全局的鼠标和键盘的钩子DLL,只是监听,对按键不作任何处理。主程序调用也没有问题,但是,在我使用MediaPlay8.0时,使用它的“可视化效果”中的“音色”,鼠标在MediaPlayer上滑动,Windows就会出错,有时还会蓝屏,测试平台为:windowsXP pro+MediaPlayer8.0和Windows2K+MediaPlayer8.0,请大家帮我分析原因。

这是我的Dll的源程序。为了进行数据区共享,项目中还有同项目名称同名的def文件,其内容为“SEGMENTS SHSEG CLASS 'SHCLASS' SHARED”,

//---------------------------------------------------------------------------
#pragma option -zRSHSEG // 改变缺省数据段名
#pragma option -zTSHCLASS // 改变缺省数据类名

#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused
#define WM_USERINPUT WM_USER + 100
#define Formname "TMainFrm"

HINSTANCE hinstance = NULL;
HWND hWnd_display = NULL;
HHOOK hookkeyb = NULL;
HHOOK hookmouse = NULL;
DWORD errorno;

LRESULT CALLBACK Key_Mouse_Proc(int nCode,WPARAM wParam,LPARAM lParam);

extern "C" __declspec(dllexport) BOOL WINAPI install_hook(HWND hWnd);
extern "C" __declspec(dllexport) BOOL WINAPI uninstall_hook();

BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
if(hinstance == NULL)
hinstance = hinst;
//ZeroMemory(&rect,sizeof(rect)); //锁鼠标
//ClipCursor(&rect);
break;
}
return 1;
}
//---------------------------------------------------------------------------

BOOL WINAPI install_hook(HWND hWnd)
{
hWnd_display = hWnd;
BOOL result = FALSE;

hookkeyb = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)Key_Mouse_Proc,hinstance,NULL);
if ( hookkeyb != NULL )
{
hookmouse = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Key_Mouse_Proc,hinstance,NULL);
if(hookmouse != NULL)
result = TRUE;
else
{
UnhookWindowsHookEx(hookkeyb);
}
}
else
errorno = GetLastError();
return result;
}

BOOL WINAPI uninstall_hook()
{
BOOL bRet = FALSE;
if(!UnhookWindowsHookEx(hookkeyb))
{
errorno = GetLastError();
}
else
{
bRet = UnhookWindowsHookEx(hookmouse);
}
return bRet;
}


LRESULT CALLBACK Key_Mouse_Proc(int nCode,WPARAM wParam,LPARAM lParam)
{
HWND hWnd = FindWindow(Formname,NULL);
SendMessage(hWnd,WM_USERINPUT,wParam,lParam);
return 0;
}
...全文
98 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowstar 2002-10-04
  • 打赏
  • 举报
回复
我用的就是 jishiping(JSP 季世平) 的代码呀!

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
install_hook(Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
uninstall_hook();
}
//---------------------------------------------------------------------------

不知道是不是这么调用的?

在Win2000 Server MediaPlayer 8.0英文版和Win2000 professional MediaPlayer 8.0中文版都试过了.
yuanreid 2002-10-04
  • 打赏
  • 举报
回复
不知道 shadowstar(天作棋盘星作子,谁人敢下?) 是怎么测试的,为什么会正常呢?
yuanreid 2002-10-04
  • 打赏
  • 举报
回复
局部钩子搞定了,全局钩子没有解决办法了吗?
yuanreid 2002-10-04
  • 打赏
  • 举报
回复
估计是.Net的问题,我的两台机器都装了VS.NET
shadowstar 2002-10-04
  • 打赏
  • 举报
回复
我没装.Net
我的是IE6.0,英文版
VC++6.0
C++Builder 6.0 下编译
yuanreid 2002-10-04
  • 打赏
  • 举报
回复
我的操作系统安装了.NET,你的安装了吗?是不是和.NET的FrameWork或CLR有冲突
jishiping 2002-10-03
  • 打赏
  • 举报
回复
如果只是监控自己的程序,就没有必要使用全局钩子了,用局部钩子就可以了。自己主程序的线程ID,可以用GetCurrentThreadID。
yuanreid 2002-10-03
  • 打赏
  • 举报
回复
可视化效果是默认的呀!我的软件是商业软件,这样的问题会有麻烦的。
另外,如果是线程钩子,在SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Mouse_Proc,hinstance,NULL);中第四个参数应该是钩子监控的线程ID,
我如何获得自己主程序的线程ID啊!
jishiping 2002-10-03
  • 打赏
  • 举报
回复
没办法啊,除非Microsoft在MediaPlayer9.0里修正这个错误。如果是边听音
乐边干活,也不用使用“可视化效果”啊。
jishiping 2002-10-03
  • 打赏
  • 举报
回复
怎么回事,使用局部钩子还没有搞定啊。上面的GetCurrentThreadID应该是
GetCurrentThreadId.
yuanreid 2002-10-02
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) ,十分感谢。不过不知道是不是可以避免这个情况(程序上,或给Windows升级之类的)。否则系统很容易出现问题,太恐怖了。以后钩子还怎么用啊!我可是很喜欢开着MediaPlayer听着音乐边干活的,其他人估计也有这个习惯,用户使用的时候不可避免要出现问题。
jishiping 2002-10-02
  • 打赏
  • 举报
回复
我测试了一下,第一次整个Windows 2000死机,后来的几次Windows 2000报告
说:wmplayer.exe产生了错误,然后Windows Media Player就退出了。据此可
以推断,是Windows Media Player的问题。更准确地说,是Windows Media
Player的“可视化效果”的“音色”有问题,而不是你的程序的问题。
ctestcode 2002-10-02
  • 打赏
  • 举报
回复
try
{
}
catch(...){}一下,就不会蓝屏了
yuanreid 2002-10-02
  • 打赏
  • 举报
回复
大家帮忙啊
yuanreid 2002-10-01
  • 打赏
  • 举报
回复
shadowstar,你好,
是用我的源程序,还是你自己的程序?我自己的程序在2k pro和xp pro下都是一样会有问题。
如果是你自己的程序,能否告诉我和我的DLL有什么区别吗?谢谢。
shadowstar 2002-10-01
  • 打赏
  • 举报
回复
我试了一下,没问题呀!
测试环境Win2k Server Media Player 8.0
yuanreid 2002-10-01
  • 打赏
  • 举报
回复
jishiping(JSP 季世平)你好,按照你的方法我又试验了一下,结果还是一样。而且十分奇怪,只和MediaPlayer的可视化效果中的“音色”冲突,其他的可视化效果都没有问题,这是为什么。如果方便的话可以帮我测试一下,我屡试不爽啊!我的编译环境为CB5.0。
十分感激。
woainihaha 2002-10-01
  • 打赏
  • 举报
回复
看看MSDN
luokaikun 2002-10-01
  • 打赏
  • 举报
回复
我想问一下:版主是如何知道参数Code小于0时,要分开处理的!
请回答
jishiping 2002-10-01
  • 打赏
  • 举报
回复
当钩子的回调函数的参数Code小于0时,需要调用CallNextHookEx。而调用
CallNextHookEx时,需要知道安装的钩子的句柄。你这儿键盘/鼠标使用同
一个回调函数,在回调函数里,就无法知道究竟是键盘的回调函数,还是鼠
标的回调函数。所以键盘钩子的回调函数和鼠标钩子的回调函数必须分开来
写。

#define WM_USERINPUT WM_USER + 100
#define Formname "TMainFrm"

HINSTANCE hinstance = NULL;
HWND hWnd_display = NULL;
HHOOK hookkeyb = NULL;
HHOOK hookmouse = NULL;
DWORD errorno;

LRESULT CALLBACK KeyBD_Proc(int nCode,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK Mouse_Proc(int nCode,WPARAM wParam,LPARAM lParam);

extern "C" __declspec(dllexport) BOOL WINAPI install_hook(HWND hWnd);
extern "C" __declspec(dllexport) BOOL WINAPI uninstall_hook();

BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
if(hinstance == NULL)
hinstance = hinst;
//ZeroMemory(&rect,sizeof(rect)); //锁鼠标
//ClipCursor(&rect);
break;
}
return 1;
}
//-----------------------------------------------------------------

BOOL WINAPI install_hook(HWND hWnd)
{
hWnd_display = hWnd;
BOOL result = FALSE;

hookkeyb = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBD_Proc,hinstance,NULL);
if ( hookkeyb != NULL )
{
hookmouse = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Mouse_Proc,hinstance,NULL);
if(hookmouse != NULL)
result = TRUE;
else
{
UnhookWindowsHookEx(hookkeyb);
}
}
else
errorno = GetLastError();
return result;
}

BOOL WINAPI uninstall_hook()
{
BOOL bRet = FALSE;
if(!UnhookWindowsHookEx(hookkeyb))
{
errorno = GetLastError();
}
else
{
bRet = UnhookWindowsHookEx(hookmouse);
}
return bRet;
}

LRESULT CALLBACK KeyBD_Proc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(hookkeyb,nCode,wParam,lParam);

HWND hWnd = FindWindow(Formname,NULL);
SendMessage(hWnd,WM_USERINPUT,wParam,lParam);
return 0;
}

LRESULT CALLBACK Mouse_Proc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(hookmouse,nCode,wParam,lParam);

HWND hWnd = FindWindow(Formname,NULL);
SendMessage(hWnd,WM_USERINPUT,wParam,lParam);
return 0;
}

13,825

社区成员

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

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