我想把系统盘(如c盘)的右键菜单中的“格式化”项变为灰色不可用的,希望用dll来实现。(对消息机制我不是太了解,希望大家讲得具体些!)
我先用exe建了个多文档的熟悉了一下相关命令,我又建了一个鼠标右键down的hook dll,但是在原来exe中可以用的函数都不行了。
exe中代码如下:
void Ccontextmenu2View::OnRButtonDown(UINT nFlags, CPoint point)
{
CView::OnRButtonDown(nFlags, point);
CMenu* menu_bar = AfxGetMainWnd()->GetMenu();
int pos = FindMenuItem(menu_bar, "文件(&F)");
if (pos == -1)
{ //return;
}
else
{
CMenu* submenu = menu_bar->GetSubMenu(pos);
pos = FindMenuItem(submenu, "关闭(&C)");
if (pos > -1)
{
UINT id = submenu->GetMenuItemID(pos);
submenu->EnableMenuItem(id,MF_DISABLED|MF_GRAYED);
}
}
CMenu* file_menu = menu_bar->GetSubMenu(0);
ASSERT(file_menu); file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
point.y, this);
}
int FindMenuItem(CMenu* Menu, LPCTSTR MenuString)//查找菜单项文字的全局函数
{
ASSERT(Menu);
ASSERT(::IsMenu(Menu->GetSafeHmenu())); int count = Menu->GetMenuItemCount();
for (int i = 0; i < count; i++)
{
CString str;
if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
(strcmp(str, MenuString) == 0))
return i;
} return -1;
}
在多文档的exe中,可以成功的把“关闭”灰掉。
但是我建了个鼠标钩子后,SetWindowsHookEx(WH_MOUSE, MyHook, hInst, 0);
在回掉函数MyHook里,我不知道如何获得右键弹出菜单的窗口句柄,不知道如何获得菜单项的id号,直接用FindMenuItem找“格式化(&A)...”找不到,反正我一点不知道该如何继续拉。下面是乱试的一段代码,有/////的那句反正是运行不到了的。
LRESULT CALLBACK MyHook(int code, WPARAM wParam, LPARAM lParam)
{
if ( (wParam==WM_RBUTTONDOWN) )// (code==HCBT_SYSCOMMAND) &&
{
HWND wMain = GetForegroundWindow();
if (wMain != 0)
{
HMENU mMenu=GetMenu(wMain);
CMenu* menu_bar = (CMenu*)mMenu;
if(menu_bar!=0)
{
UINT it=menu_bar->EnableMenuItem(id,MF_DISABLED|MF_GRAYED); /////
}
}
}
return ::CallNextHookEx(g_hHookscreensaver, code, wParam, lParam);
}
希望大家多多指教,最好讲解的具体些,如果有完整的例子代码那就太感激了。
我先用exe建了个多文档的熟悉了一下相关命令,我又建了一个鼠标右键down的hook dll,但是在原来exe中可以用的函数都不行了。
exe中代码如下:
void Ccontextmenu2View::OnRButtonDown(UINT nFlags, CPoint point)
{
CView::OnRButtonDown(nFlags, point);
CMenu* menu_bar = AfxGetMainWnd()->GetMenu();
int pos = FindMenuItem(menu_bar, "文件(&F)");
if (pos == -1)
{ //return;
}
else
{
CMenu* submenu = menu_bar->GetSubMenu(pos);
pos = FindMenuItem(submenu, "关闭(&C)");
if (pos > -1)
{
UINT id = submenu->GetMenuItemID(pos);
submenu->EnableMenuItem(id,MF_DISABLED|MF_GRAYED);
}
}
CMenu* file_menu = menu_bar->GetSubMenu(0);
ASSERT(file_menu); file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
point.y, this);
}
int FindMenuItem(CMenu* Menu, LPCTSTR MenuString)//查找菜单项文字的全局函数
{
ASSERT(Menu);
ASSERT(::IsMenu(Menu->GetSafeHmenu())); int count = Menu->GetMenuItemCount();
for (int i = 0; i < count; i++)
{
CString str;
if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
(strcmp(str, MenuString) == 0))
return i;
} return -1;
}
在多文档的exe中,可以成功的把“关闭”灰掉。
但是我建了个鼠标钩子后,SetWindowsHookEx(WH_MOUSE, MyHook, hInst, 0);
在回掉函数MyHook里,我不知道如何获得右键弹出菜单的窗口句柄,不知道如何获得菜单项的id号,直接用FindMenuItem找“格式化(&A)...”找不到,反正我一点不知道该如何继续拉。下面是乱试的一段代码,有/////的那句反正是运行不到了的。
LRESULT CALLBACK MyHook(int code, WPARAM wParam, LPARAM lParam)
{
if ( (wParam==WM_RBUTTONDOWN) )// (code==HCBT_SYSCOMMAND) &&
{
HWND wMain = GetForegroundWindow();
if (wMain != 0)
{
HMENU mMenu=GetMenu(wMain);
CMenu* menu_bar = (CMenu*)mMenu;
if(menu_bar!=0)
{
UINT it=menu_bar->EnableMenuItem(id,MF_DISABLED|MF_GRAYED); /////
}
}
}
return ::CallNextHookEx(g_hHookscreensaver, code, wParam, lParam);
}
希望大家多多指教,最好讲解的具体些,如果有完整的例子代码那就太感激了。
因为你得到得菜单不是你想要得哪个菜单你首先获取鼠标是在FolderView上并且IShellView::GetCurrentInfo 获取状态,如果此时右键单击在C得盘符上,这个时候你再GetMenu看行不行
在dll中AfxGetMainWnd()不对,应该如何获得菜单的句柄呢?