我做了一个鼠标钩子,当打开某一个盘时,禁止鼠标右键功能,但现在发现有一个问题,不知如何解决。我把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,我把程序发给你们看就明白了
盘可以?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,我把程序发给你们看就明白了
handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
得到的是最前面的那个窗口,所以就出现了你的那个问题,
handle1可以用 LPARAM lParam取得,这是个结构MOUSEHOOKSTRUCT ,这个中的HWND hwnd;
指的就是接受鼠标信息的句柄,你通过这个句柄再查找判断是否d盘
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);
的句柄,但我想的是当鼠标移到ListCtrl时,就能得到Edit控件的句柄和Edit上的字符串。但ListCtrl和Edit没有直接的
联系,就像先得到CabinetWClass的句柄,再得到WorkerW,ReBarWindow32,ComboBoxEx32,ComboBox,最后才能得到Edit
句柄,Edit和ListCtrl怎样联系再一起?
handle1=FindWindowEx( NULL, NULL, "CabinetWClass",NULL );
改成
handle1=WindowFromPoint(((PMOUSEHOOKSTRUCT)lParam)->pt);
其它不变。
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);
}
,放在ListCtrl上并不可以得到Edit控件上的字符串,我的想法是当我的鼠标移到ListCtrl上时,
得到该窗口Edit句柄,并得到Edit上的盘符,从而禁止鼠标右键功能。但我不知道怎样把ListCtrl和Edit联系在一起
HWND parent = ((MOUSEHOOKSTRUCT *)lParam)->hwnd;
HWND wnd;
do {
wnd = parent;
parent = (HWND)GetWindowLong(wnd, GWL_HWNDPARENT);
} while (parent != NULL);
handle1 = wnd;