我做了一个鼠标钩子,当打开某一个盘时,禁止鼠标右键功能,但现在发现有一个问题,不知如何解决。我把D盘设为禁止鼠标右键功能,左边区域为D盘窗口,右边区域为E盘窗口,当D盘窗口为最顶层(激活层)时,D盘和右边的E盘都不可以实现右键功能,当E盘窗口为最顶层,就变成D盘和E盘都可以实现右键功能,有什么办法当D盘窗口为最顶层(激活层)时,只有D盘不可以实现右键功能,而E
盘可以?LRESULT WINAPI CallBackMouseMsgProc(int code, WPARAM wParam, LPARAM lParam)
{CString str,FilePath,str1; if (code>=0)
{
HWND handle1,handle2,handle3,handle4,handle5,handle6;
handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
do
{
handle2=FindWindowEx(handle1,NULL,"WorkerW", NULL );
handle3=FindWindowEx(handle2,NULL,"ReBarWindow32",NULL);
handle4=FindWindowEx(handle3,NULL,"ComboBoxEx32",NULL);
handle5=FindWindowEx(handle4,NULL,"ComboBox",NULL);
handle6=FindWindowEx(handle5,NULL,"Edit",NULL);

if (handle6!=NULL)
break;
handle1=FindWindowEx(NULL,handle1,"CabinetWClass",NULL );
}
while(handle1!=NULL);
if (handle2!=NULL)
{
if(handle3!=NULL)
{
if (handle4!=NULL)
{
if(handle5!=NULL)
if (handle6!=NULL)
{
{
CEdit* p = (CEdit*)CEdit::FromHandle(handle6);p->GetWindowText(str1);
str=str1.Mid(0,2);OutputDebugString(str);p->SetReadOnly();
} }
}
}
}if (HC_ACTION == code || HC_NOREMOVE == code)
{

if (strncmp(str,"D:",2)!=0)
{
return(CallNextHookEx(NULL,code,wParam,lParam));
}if (WM_MOUSEMOVE == wParam || WM_MOUSEWHEEL==wParam)
{
return(CallNextHookEx(NULL,code,wParam,lParam));
} if (WM_LBUTTONDOWN==wParam ||WM_LBUTTONUP==wParam || WM_LBUTTONDBLCLK==wParam )
{

          return(CallNextHookEx(NULL,code,wParam,lParam));
}
        if (WM_NCLBUTTONDOWN==wParam  ||WM_NCLBUTTONUP==wParam || WM_NCHITTEST==wParam || WM_NCLBUTTONDBLCLK==wParam)
{

          return(CallNextHookEx(NULL,code,wParam,lParam)); }        if (WM_NCRBUTTONDOWN==wParam ||WM_NCRBUTTONUP==wParam )
   {     return(CallNextHookEx(NULL,code,wParam,lParam)); }
}return TRUE;
}如果大家还是不明白,请留下Email,我把程序发给你们看就明白了

解决方案 »

  1.   

    是不是有多个"CabinetWClass"类型的窗口?
    handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
    得到的是最前面的那个窗口,所以就出现了你的那个问题,
    handle1可以用 LPARAM lParam取得,这是个结构MOUSEHOOKSTRUCT ,这个中的HWND hwnd;
    指的就是接受鼠标信息的句柄,你通过这个句柄再查找判断是否d盘
      

  2.   

    不是很清楚你的意思,提点参考意见看看有没有帮助:利用WindowFromPoint函数可以查出鼠标在哪个窗口的上面;另外RealChildWindowFromPoint可以找出鼠标在哪个控件上面。
      

  3.   

    简单的来说我上面的做法是当D盘窗口的在最顶层时,我才能得到D盘的窗口句柄,我要的是正如stonewater 所讲的一样,不管D盘是否在最顶层,当我的鼠标移到D盘窗口上,我就可以得到D盘的句柄
      

  4.   

    handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
            do
            {
            handle2=FindWindowEx(handle1,NULL,"WorkerW", NULL );
            handle3=FindWindowEx(handle2,NULL,"ReBarWindow32",NULL);
            handle4=FindWindowEx(handle3,NULL,"ComboBoxEx32",NULL);
            handle5=FindWindowEx(handle4,NULL,"ComboBox",NULL);
            handle6=FindWindowEx(handle5,NULL,"Edit",NULL);
        
            if (handle6!=NULL)
                break;
            handle1=FindWindowEx(NULL,handle1,"CabinetWClass",NULL );
            }
    while(handle1!=NULL);改为下面试试:
            handle1 = ((MOUSEHOOKSTRUCT *)lParam)->hwnd;        handle2=FindWindowEx(handle1,NULL,"WorkerW", NULL );
            handle3=FindWindowEx(handle2,NULL,"ReBarWindow32",NULL);
            handle4=FindWindowEx(handle3,NULL,"ComboBoxEx32",NULL);
            handle5=FindWindowEx(handle4,NULL,"ComboBox",NULL);
            handle6=FindWindowEx(handle5,NULL,"Edit",NULL);
      

  5.   

    你现在的做法是用FindWindowEx来查找第1个CabinetWClass类的窗口的,我上面回复的意思是让你用WindowFromPoint直接查出鼠标在哪个窗口上面,用这个方法代替这个FindWindowEx。
      

  6.   

    to cnzdgs and stonewater 你们的方法我都试了,当鼠标移到ListCtrl时,能得到ListCtrl的信息,如ListCtrl的class name 和ListCtrl
    的句柄,但我想的是当鼠标移到ListCtrl时,就能得到Edit控件的句柄和Edit上的字符串。但ListCtrl和Edit没有直接的
    联系,就像先得到CabinetWClass的句柄,再得到WorkerW,ReBarWindow32,ComboBoxEx32,ComboBox,最后才能得到Edit
    句柄,Edit和ListCtrl怎样联系再一起?
      

  7.   

    我的意思就是把
    handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
    改成
    handle1=WindowFromPoint(((PMOUSEHOOKSTRUCT)lParam)->pt);
    其它不变。
      

  8.   

    HWND handle1,handle2,handle3,handle4,handle5,handle6;
            handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
            do
            {
            handle2=FindWindowEx(handle1,NULL,"WorkerW", NULL );
            handle3=FindWindowEx(handle2,NULL,"ReBarWindow32",NULL);
            handle4=FindWindowEx(handle3,NULL,"ComboBoxEx32",NULL);
            handle5=FindWindowEx(handle4,NULL,"ComboBox",NULL);
            handle6=FindWindowEx(handle5,NULL,"Edit",NULL);
        
            if (handle6!=NULL)
                break;
            handle1=FindWindowEx(NULL,handle1,"CabinetWClass",NULL );
            }
            while(handle1!=NULL);改为:
    HWND handle1,handle2,handle3,handle4,handle5,handle6,handle9;
    handle9 = ((MOUSEHOOKSTRUCT *)lParam)->hwnd;
    handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL ); 
    while(handle1)
    {
    if(handle1 == handle9)
    break;
    if(IsChild(handle1,handle9)
    break;
    handle1=FindWindowEx(NULL,handle1,"CabinetWClass",NULL );
    }
    if(handle1)
    {
    handle2=FindWindowEx(handle1,NULL,"WorkerW", NULL );
        handle3=FindWindowEx(handle2,NULL,"ReBarWindow32",NULL);
        handle4=FindWindowEx(handle3,NULL,"ComboBoxEx32",NULL);
        handle5=FindWindowEx(handle4,NULL,"ComboBox",NULL);
        handle6=FindWindowEx(handle5,NULL,"Edit",NULL);
    }
      

  9.   

    to cnzdgs and stonewater 可能我讲的不清楚吧,你们的方法只有把鼠标放在窗口的标题栏上才能够得到Edit上的字符串
    ,放在ListCtrl上并不可以得到Edit控件上的字符串,我的想法是当我的鼠标移到ListCtrl上时,
    得到该窗口Edit句柄,并得到Edit上的盘符,从而禁止鼠标右键功能。但我不知道怎样把ListCtrl和Edit联系在一起
      

  10.   

    to stonewater 你的方法我现在试试看
      

  11.   

    to stonewater 你的方法我现在试试看
      

  12.   

    用IsChild判断是否子窗口还不行吗
      

  13.   

    用IsChild判断是否子窗口还不行吗
      

  14.   

    用IsChild判断是否子窗口还不行吗
      

  15.   

    你再换种方法:
    HWND parent = ((MOUSEHOOKSTRUCT *)lParam)->hwnd;
    HWND wnd;
    do {
    wnd = parent;
    parent = (HWND)GetWindowLong(wnd, GWL_HWNDPARENT);
    } while (parent != NULL);
    handle1 = wnd;
      

  16.   

    谢谢,stonewater 和cnzdgs 的帮忙,用stonewater 的方法可以了,cnzdgs 讲的方法我会在试试,先结贴