我想把系统盘(如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);
}
希望大家多多指教,最好讲解的具体些,如果有完整的例子代码那就太感激了。

解决方案 »

  1.   

    你这样肯定不行
    因为你得到得菜单不是你想要得哪个菜单你首先获取鼠标是在FolderView上并且IShellView::GetCurrentInfo 获取状态,如果此时右键单击在C得盘符上,这个时候你再GetMenu看行不行
      

  2.   

    gz这样也不行,这个时候您GetMenu也不是右键菜单,因为它还没有弹出来
      

  3.   

    那要怎么处理呢?但是我在多文档里用鼠标右键一down下去就去getmenu,虽然没弹出,但是还是可以获得右键菜单的。
      

  4.   

    判断是否是c盘方法很多,我主要是想知道如何得到系统的悬浮菜单项,句柄或是id。我用spy++跟了多文档的exe的进程消息,可以获得wm_menuselect的消息,其中有选中的菜单项id,但是我跟了窗口的消息,点右键,选了格式化,都没有wm_menuselect的消息的,更不用说id了。
      

  5.   

    终于找到格式化菜单项的id了,现在的问题是,在多文档的exe中,可以用CMenu* menu_bar = AfxGetMainWnd()->GetMenu(); 来获得弹出窗口指针,再用menu_bar->EnableMenuItem(57602,MF_DISABLED|MF_GRAYED); 就可以灰掉“关闭”项了,
    在dll中AfxGetMainWnd()不对,应该如何获得菜单的句柄呢?
      

  6.   

    用Icontextmenu接口即可。在其中EnableMenuItem就行拉!