钩子高手们,关于鼠标键盘钩子的超级重大问题!!
我自己写了一个全局的鼠标和键盘的钩子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;
}