我是VC新手,想写一个鼠标钩子,屏蔽鼠标右键,现在能屏蔽右键,但是不能只针对某一个窗口。
就是说只屏蔽我想屏蔽的窗口的右键,其他的不受影响。希望高手帮忙!!!最好有代码实现(不能是MFC扩展DLL,VB调用)
我的代码如下:
// MOUSEHOOKDLL.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "MOUSEHOOKDLL.h"HWND glhPrevTarWnd=NULL;
HINSTANCE glhInstance=NULL;
HHOOK glhHook=NULL;
UINT Global_i=0;
HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄
_stdcall EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char buff[256];
{
::GetWindowText(hwnd,buff,255);
if(lstrcmp(buff,"Form1")>0)
{
Global_i=1;
}
else
Global_i=0; }
return 1;
}
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam;
/*
if(nCode>=0)
{
HWND glhTargetWnd=pMouseHook->hwnd; //取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄
} if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[256];
::GetWindowText(glhTargetWnd,szCaption,100);
//取目标窗口标题
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
*/
if(nCode>=0)
{
if(wParam==WM_RBUTTONDOWN || wParam==WM_RBUTTONUP)
{
::EnumWindows(EnumWindowsProc,NULL);
if (Global_i=1)
{
return true;
} }
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
} glhInstance=(HINSTANCE)hModule;
if (glhInstance==NULL)
MessageBox(NULL,"初始化失败!","提示",MB_OK);
return TRUE;
}
_stdcall int starthook()
{
BOOL bResult=false;
glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL);
if(glhHook!=NULL)
{
bResult=true;
MessageBox(NULL,"调用成功!","提示",MB_OK);
}
return bResult;
}_stdcall int stophook()
{
BOOL bResult=FALSE;
if(glhHook)
{
{
bResult=UnhookWindowsHookEx(glhHook);
if(bResult)
{
MessageBox(NULL,"卸载成功!","提示",MB_OK);
glhHook=NULL;
}
}
}return bResult;
}
就是说只屏蔽我想屏蔽的窗口的右键,其他的不受影响。希望高手帮忙!!!最好有代码实现(不能是MFC扩展DLL,VB调用)
我的代码如下:
// MOUSEHOOKDLL.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "MOUSEHOOKDLL.h"HWND glhPrevTarWnd=NULL;
HINSTANCE glhInstance=NULL;
HHOOK glhHook=NULL;
UINT Global_i=0;
HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄
_stdcall EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char buff[256];
{
::GetWindowText(hwnd,buff,255);
if(lstrcmp(buff,"Form1")>0)
{
Global_i=1;
}
else
Global_i=0; }
return 1;
}
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam;
/*
if(nCode>=0)
{
HWND glhTargetWnd=pMouseHook->hwnd; //取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄
} if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[256];
::GetWindowText(glhTargetWnd,szCaption,100);
//取目标窗口标题
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
*/
if(nCode>=0)
{
if(wParam==WM_RBUTTONDOWN || wParam==WM_RBUTTONUP)
{
::EnumWindows(EnumWindowsProc,NULL);
if (Global_i=1)
{
return true;
} }
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
} glhInstance=(HINSTANCE)hModule;
if (glhInstance==NULL)
MessageBox(NULL,"初始化失败!","提示",MB_OK);
return TRUE;
}
_stdcall int starthook()
{
BOOL bResult=false;
glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL);
if(glhHook!=NULL)
{
bResult=true;
MessageBox(NULL,"调用成功!","提示",MB_OK);
}
return bResult;
}_stdcall int stophook()
{
BOOL bResult=FALSE;
if(glhHook)
{
{
bResult=UnhookWindowsHookEx(glhHook);
if(bResult)
{
MessageBox(NULL,"卸载成功!","提示",MB_OK);
glhHook=NULL;
}
}
}return bResult;
}
{
::EnumWindows(EnumWindowsProc,NULL);
这个逻辑有错误吗???
{
char buff[256];
{
::GetWindowText(hwnd,buff,255);
if(lstrcmp(buff,"Form1")>0)
{
Global_i=1;
}
else
Global_i=0; }
return 1;
}
===========================》改成
_stdcall EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char buff[256];
{
::SendMessage(hwnd,WM_GETTEXT,(WPARAM)255,(LPARAM)buff); if(lstrcmp(buff,"Form1")>0)
{
Global_i=1;
}
else
Global_i=0; }
return 1;
}
1。判断该窗口是否打开了,若打开了,(用定时或者其他机制)则转22。取得你要屏蔽的窗口的进程ID,别说你不能够找到该窗口的进程名称啊,就是通过名称找到进程ID。
可以用经常快照等实现,找到其PID。这样的函数很多,我也懒得贴了。3。可以下钩子了。
下面分享一下吧
// MOUSEHOOKDLL.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "MOUSEHOOKDLL.h"HWND glhPrevTarWnd=NULL;
HINSTANCE glhInstance=NULL;
HHOOK glhHook=NULL;
UINT Global_i=0;
HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; if(nCode>=0)
{
HWND glhTargetWnd=pMouseHook->hwnd; //取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄
} if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[256];
::GetWindowText(glhTargetWnd,szCaption,100);
//取目标窗口标题
if (strcmp(szCaption,"Form1")==0)
{
if (wParam==WM_RBUTTONUP || wParam==WM_RBUTTONDOWN)
return true;
}
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);}BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
} glhInstance=(HINSTANCE)hModule;
if (glhInstance==NULL)
MessageBox(NULL,"初始化失败!","提示",MB_OK);
return TRUE;
}
_stdcall int starthook()
{
BOOL bResult=-1;
glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL);
if(glhHook!=NULL)
{
//成功
bResult=0;
//MessageBox(NULL,"调用成功!","提示",MB_OK);
}
return bResult;
}_stdcall int stophook()
{
BOOL bResult=-1;
if(glhHook)
{
{
bResult=UnhookWindowsHookEx(glhHook);
if(bResult)
{
//MessageBox(NULL,"卸载成功!","提示",MB_OK);
glhHook=NULL;
bResult=0;
}
}
}return bResult;
}