我是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; 
}

解决方案 »

  1.   

    用FindWindow查找目标窗口的HWND,然后判断HWND就可以
      

  2.   

    GetWindowThreadProcessId来判断窗口的归属。
      

  3.   

    if(wParam==WM_RBUTTONDOWN || wParam==WM_RBUTTONUP)
    {
    ::EnumWindows(EnumWindowsProc,NULL);
    这个逻辑有错误吗???
      

  4.   

    _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;
    }
    ===========================》改成
    _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;
    }
      

  5.   

    bobob(静思)(PDFViewer2.0 Release拉!) ( ) 信誉:156 不灵啊有人能帮我吗????
      

  6.   

    那你要对特定的窗口,
    1。判断该窗口是否打开了,若打开了,(用定时或者其他机制)则转22。取得你要屏蔽的窗口的进程ID,别说你不能够找到该窗口的进程名称啊,就是通过名称找到进程ID。
       可以用经常快照等实现,找到其PID。这样的函数很多,我也懒得贴了。3。可以下钩子了。
      

  7.   

    我自己搞定了,感谢你们。
    下面分享一下吧
    // 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; 
    }
      

  8.   

    直接  hook  mouse 消息就可以了,在 HookProc 中取得 窗口的 text 判断就可以了