我用如下代碼:
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,我卻得不到菜單句柄,為何呢?
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,我卻得不到菜單句柄,為何呢?
这个可能返回的是一个listbox或是edit什么的HANDLE吧。
他们也是一个window
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,為何