我用如下代碼:
POINT ptCursor;
HWND hwndUnderCursor;
HMENU hMenu;
UINT iMenuItem;GetCursorPos(&ptCursor);
hwndUnderCursor=WindowFromPoint(ptCursor);
hMenu=GetMenu(hwndUnderCursor);
iMenuItem=MenuItemFromPoint(hwndUnderCursor,hMenu,ptCursor);
檢查如VC這樣的程序,都沒有返回結果(結果是-1),
最后發現是在GetMenu時出了問題,明明對象窗口有menu,我卻得不到菜單句柄,為何呢?

解决方案 »

  1.   

    hwndUnderCursor=WindowFromPoint(ptCursor);
    这个可能返回的是一个listbox或是edit什么的HANDLE吧。
    他们也是一个window
      

  2.   

    為了找到光標所在點的菜單選項的句柄,我用了如下代碼:開始找到光標所在點的窗口,並列出其菜單資源.
    HINSTANCE hInstMain;
    HWND hTopHwnd;
    BOOL bHaveFoundMainHwnd=FALSE;
    while(!bHaveFoundMainHwnd)
    {
    if(GetParent(hwndUnderCursor)!=NULL)
    {
        hwndUnderCursor=GetParent(hwndUnderCursor);
                hTopHwnd=GetParent(hwndUnderCursor);
            }
            else
    {
        bHaveFoundMainHwnd=TRUE;
    }
    }if(hTopHwnd==NULL)
         hTopHwnd=hwndUnderCursor;hInstMain = (HINSTANCE) GetWindowLong (hTopHwnd, GWL_HINSTANCE);
    if(hInstMain)
    {
           EnumResourceNames(hInstMain,RT_MENU,(ENUMRESNAMEPROC)EnumMenuNameProc,0);
    }
    列出菜單資源的回調函數
    BOOL CALLBACK EnumMenuNameProc(HINSTANCE hModule,LPCTSTR lpszType,LPTSTR lpszName,LONG lParam)      
    {
    HMENU hMenu;
    HRSRC hHrsc;
    hHrsc=FindResource(hModule,lpszName,RT_MENU);
    hMenu=(HMENU)LoadResource(hModule,hHrsc);
    if(hMenu!=NULL)
    {
    UINT iMenuItem=0;
    POINT ptCursor;
    HWND hwndUnderCursor; GetCursorPos(&ptCursor);
    hwndUnderCursor=WindowFromPoint(ptCursor); HWND hTopHwnd;
    BOOL bHaveFoundMainHwnd=FALSE;
    while(!bHaveFoundMainHwnd)
    {
    if(GetParent(hwndUnderCursor)!=NULL)
    {
    hwndUnderCursor=GetParent(hwndUnderCursor);
    hTopHwnd=GetParent(hwndUnderCursor);
    }
    else
    {
    bHaveFoundMainHwnd=TRUE;
    }
    } if(hTopHwnd==NULL)
    hTopHwnd=hwndUnderCursor; iMenuItem=MenuItemFromPoint(hTopHwnd,hMenu,ptCursor); if(iMenuItem!=-1)
    {
    MessageBox(NULL,"OK","OK",MB_OK);
    }
    } return TRUE;
    }但是我發現結果卻是任何東西都沒有返回,iMenuItem為-1,為何