菜单 也是一种窗口 怎样获得它的窗口句柄(不是hMenu)或者它的窗口类名,谢谢!!
我说菜单是窗口是因为 我枚举窗口,然后将其SW_HIDE,菜单也会被隐藏!!而我并没有隐藏它的主窗口。

解决方案 »

  1.   

    菜单不是窗口,它只是窗口的附属品,看看CreateWindow函数的定义就知道了
    HWND CreateWindow(
      LPCTSTR lpClassName,  // registered class name
      LPCTSTR lpWindowName, // window name
      DWORD dwStyle,        // window style
      int x,                // horizontal position of window
      int y,                // vertical position of window
      int nWidth,           // window width
      int nHeight,          // window height
      HWND hWndParent,      // handle to parent or owner window
      HMENU hMenu,          // menu handle or child identifier
      HINSTANCE hInstance,  // handle to application instance
      LPVOID lpParam        // window-creation data
    );
    其中hMenu就是所要创建的窗口中菜单的句柄
    要获得某窗口的菜单句柄 用GetMenu就行了
    HMENU GetMenu(
      HWND hWnd  // handle to window
    );
      

  2.   

    我想你说的不对,因为我已经通过枚举窗口然后GetClassName获得了菜单的类名  #32768
    虽然它看起来不像窗口,但是,它确实是一种子窗口!!
      

  3.   

    画在屏幕上的菜单是窗口,但hmenu之类不是。
    既然你枚举了,不是已经得到了吗?
      

  4.   

    经过查找资料以及自己的实验,证实屏幕上弹出的菜单确实是窗口,
    其ClassName为"#32768" WindowText为空字符串,由此要获得窗口句柄也就不难了
    建一个mfc对话框程序,处理WM_INITPOPUPMENU消息如下
    void CMyDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    CWnd *pWnd = FindWindow("#32768", "");
    if(!pWnd) return;
    CWnd *pWnd2 = pWnd->GetParent();
    }
    调试程序可知pWnd 不等于 0 其handle为 0x0001001a
    pWnd2 等于 0 即菜单窗口没有父窗口,不属于子窗口
    实际上,若菜单窗口是子窗口的话,FindWindow就不会返回菜单窗口的句柄有了菜单窗口的指针,就可以做些有趣的事了,
    比如利用windows2000的功能使菜单窗口变透明等等
      

  5.   

    菜单是窗口,
    要得到菜单窗口句柄
    在vckbase网上有一篇文章介绍用钩子为菜单添加阴影,
    里面好像有讲如何得到句柄