第一步用查找窗口,得到应用程序的句柄 HWND hPS=FindWindow( _T("窗口标题"), NULL);
第二步添加消息钩子,g_hPMsg = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hinstDll,  dwThreadID);
第三步 回调函数中单击菜单项消息
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
……
MSG *msg = (MSG*)lParam;
int wld = LOWORD(msg->wParam);
switch (msg->message)
……
case WM_COMMAND:
                  wld是单击菜单项的句柄吧,
                  现在如何根据wld得到单击的菜单项上的文字内容?

解决方案 »

  1.   

    该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控件,则拷贝控件的文本。但是,GetWindowText不能接收其他应用程序中控件的文本。   
    函数原型:
    Int GetWindowText(HWND hWnd,LPTSTR lpString,Int nMaxCount);
    hWnd:带文本的窗口或控件的句柄。   
    IpString:指向接收文本的缓冲区的指针。   
    nMaxCount:指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断。
      

  2.   

    int wld = LOWORD(msg->wParam);
    通过WM_COMMAND消息获取了菜单ID(wld),现如何根据应用程序句柄和菜单ID,获取这个菜单项的文字内容。
      

  3.   

    现在通过WM_COMMAND已经知道菜单ID,int wld = LOWORD(msg->wParam);
    如何加上应用程序句柄,得到菜单项的文字内容?
      

  4.   

    GetMenuString 或 GetMenuItemInfoThe GetMenuString function has been superseded. Use the GetMenuItemInfo function to retrieve the menu item text.
      

  5.   

    楼主是Win32啊
    怪不得不能直接查CMenu获得方法呢API我记得是GetMenuInfo
      

  6.   

    CString strName;
    CMenu *pMenu=AfxGetMainWnd()->GetMenu();
    pMenu->GetMenuString(wld,strName,MF_BYCOMMAND);
    MessageBox(strName);
      

  7.   


    LPCTSTR GetMenuItemText(HMENU hMenu, UINT nID)
    {
      TCHAR szBuf[256]= {0};
      MENUITEMINFO menuInfo = {0};
      menuInfo.cbSize = sizeof(MENUITEMINFO);
      menuInfo.fMask = MIIM_TYPE;
      menuInfo.dwTypeData = szBuf;
      menuInfo.cch = 255;
      GetMenuItemInfo(hMenu, nID, FALSE, &menuInfo);
      TRACE( _T("Menu %d ==> %s\n"), nID, menuInfo.dwTypeData );  return menuInfo.dwTypeData;
    }
      

  8.   

    谢谢大家,用GetMenuString(psMenu,wID,sName,sizeof(sName),MF_BYCOMMAND);或GetMenuItemInfo(psMenu, wID, FALSE, &menuInfo);都能得到部分菜单内容。但有些菜单无法得到,比如photoshop中的滤镜菜单等。如何能得到这些菜单上的单击时的文字内容?是不是动态添加的就不行?
      

  9.   

    要确定下photoshop是不是 使用的windows的菜单 还是他自己实现的菜单。
      

  10.   

    “是不是动态添加的”
    是在 InitPopUpMenu 中把
      

  11.   

    比如photoshop中文件菜单中的能大部分取得,但象滤镜菜单就无法取得。
      

  12.   

    打开(&O)... Ctrl+O
    还原平均 Ctrl+Z
    填充(&L)... Shift+F5
    彩块化 Ctrl+F
    为什么在同一个菜单中的某些菜单项就取不到?
      

  13.   

    本来以为WM_COMMAND事件中反查失败是菜单消失,动态菜单不能取得。现在改用WM_MENUSLECT事件,这样菜单还显示的,为什么这些菜单还是不能取得?
    新建(&N)... Ctrl+N
    打开(&O)... Ctrl+O
    浏览(&B)... Shift+Ctrl+O
    打开为(&A)... Alt+Ctrl+O
    浏览(&B)... Shift+Ctrl+O
    打开(&O)... Ctrl+O
    新建(&N)... Ctrl+N
    关于 Photoshop(&A)...
    还原彩块化 Ctrl+Z
    向前(&W) Shift+Ctrl+Z
    返回(&K) Alt+Ctrl+Z
    向前(&W) Shift+Ctrl+Z
    还原彩块化 Ctrl+Z
    关于 Photoshop(&A)...
    位图(&B)
    灰度(&G)
    双色调(&D)
    灰度(&G)
    位图(&B)
    彩块化 Ctrl+F