还是关于鼠标右键的问题

naixian1983 2008-06-12 10:33:20
我做了一个鼠标钩子,当打开某一个盘时,禁止鼠标右键功能,但现在发现有一个问题,不知如何解决。我把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,我把程序发给你们看就明白了
...全文
195 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqvbjhc 2008-06-12
  • 打赏
  • 举报
回复
mark
stonewater 2008-06-12
  • 打赏
  • 举报
回复
是不是有多个"CabinetWClass"类型的窗口?
handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
得到的是最前面的那个窗口,所以就出现了你的那个问题,
handle1可以用 LPARAM lParam取得,这是个结构MOUSEHOOKSTRUCT ,这个中的HWND hwnd;
指的就是接受鼠标信息的句柄,你通过这个句柄再查找判断是否d盘

scq2099yt 2008-06-12
  • 打赏
  • 举报
回复
up
jiqing_gao 2008-06-12
  • 打赏
  • 举报
回复
gz
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
自己顶
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
谢谢,stonewater 和cnzdgs 的帮忙,用stonewater 的方法可以了,cnzdgs 讲的方法我会在试试,先结贴
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
你再换种方法:
HWND parent = ((MOUSEHOOKSTRUCT *)lParam)->hwnd;
HWND wnd;
do {
wnd = parent;
parent = (HWND)GetWindowLong(wnd, GWL_HWNDPARENT);
} while (parent != NULL);
handle1 = wnd;
stonewater 2008-06-12
  • 打赏
  • 举报
回复
用IsChild判断是否子窗口还不行吗
stonewater 2008-06-12
  • 打赏
  • 举报
回复
用IsChild判断是否子窗口还不行吗
stonewater 2008-06-12
  • 打赏
  • 举报
回复
用IsChild判断是否子窗口还不行吗
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
to stonewater

你的方法我现在试试看
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
to stonewater

你的方法我现在试试看
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
to cnzdgs and stonewater

可能我讲的不清楚吧,你们的方法只有把鼠标放在窗口的标题栏上才能够得到Edit上的字符串
,放在ListCtrl上并不可以得到Edit控件上的字符串,我的想法是当我的鼠标移到ListCtrl上时,
得到该窗口Edit句柄,并得到Edit上的盘符,从而禁止鼠标右键功能。但我不知道怎样把ListCtrl和Edit联系在一起
stonewater 2008-06-12
  • 打赏
  • 举报
回复
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);
}
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
我的意思就是把
handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
改成
handle1=WindowFromPoint(((PMOUSEHOOKSTRUCT)lParam)->pt);
其它不变。
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
to cnzdgs and stonewater

你们的方法我都试了,当鼠标移到ListCtrl时,能得到ListCtrl的信息,如ListCtrl的class name 和ListCtrl
的句柄,但我想的是当鼠标移到ListCtrl时,就能得到Edit控件的句柄和Edit上的字符串。但ListCtrl和Edit没有直接的
联系,就像先得到CabinetWClass的句柄,再得到WorkerW,ReBarWindow32,ComboBoxEx32,ComboBox,最后才能得到Edit
句柄,Edit和ListCtrl怎样联系再一起?
stonewater 2008-06-12
  • 打赏
  • 举报
回复
注意str和str1变量的操作
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
你现在的做法是用FindWindowEx来查找第1个CabinetWClass类的窗口的,我上面回复的意思是让你用WindowFromPoint直接查出鼠标在哪个窗口上面,用这个方法代替这个FindWindowEx。
stonewater 2008-06-12
  • 打赏
  • 举报
回复
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);
naixian1983 2008-06-12
  • 打赏
  • 举报
回复
简单的来说我上面的做法是当D盘窗口的在最顶层时,我才能得到D盘的窗口句柄,我要的是正如stonewater 所讲的一样,不管D盘是否在最顶层,当我的鼠标移到D盘窗口上,我就可以得到D盘的句柄
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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