如何获取弹出菜单的所有者 window
How to get a pop-up menu's owner window
打开弹出式菜单时,使用函数 TrackPopupMenu
,该函数将“拥有该菜单的 window 的句柄作为参数".
我想知道屏幕上可见的任何弹出菜单的所有者 window。
是否有可能获得此类 window 的句柄,即使它属于另一个进程?
我已经尝试了以下 WinAPI 调用但没有成功:
GetParent(menuHWND) ; //returns null
GetWindow(menuHWND, GW_OWNER) ; //returns null
GetAncestor(menuHWND, GA_ROOTOWNER) ; //returns menuHWND
编辑:
我使用函数 WindowFromPoint
获得菜单句柄
GetGUIThreadInfo
知道:
static DWORD CALLBACK MenuPeekerThread(LPVOID)
{
Sleep(1500); // Wait for menu to show because this is just a silly example
POINT pt = { 2, 2 };
HWND hwndMenu = WindowFromPoint(pt);
GUITHREADINFO gti = { sizeof(GUITHREADINFO), };
DWORD tid = GetWindowThreadProcessId(hwndMenu, NULL);
if (tid && GetGUIThreadInfo(tid, >i))
{
printf("owner is %p\n", gti.hwndMenuOwner);
}
return 0;
}
static void TestMenuThing(HWND hwnd)
{
CloseHandle(CreateThread(NULL, 0, MenuPeekerThread, NULL, 0, NULL));
HMENU hMenu = CreatePopupMenu();
AppendMenu(hMenu, 0, 1, TEXT("Foo"));
AppendMenu(hMenu, 0, 1, TEXT("Bar"));
TrackPopupMenu(hMenu, 0, 0, 0, 0, hwnd, NULL);
DestroyMenu(hMenu);
}
GetGUIThreadInfo
是在 Windows 2000 中添加的,如果你需要支持任何更旧的东西,你需要一个 hook 并在为 [=18] 调用挂钩时比较 HMENU 参数=] 消息。
打开弹出式菜单时,使用函数 TrackPopupMenu
,该函数将“拥有该菜单的 window 的句柄作为参数".
我想知道屏幕上可见的任何弹出菜单的所有者 window。
是否有可能获得此类 window 的句柄,即使它属于另一个进程?
我已经尝试了以下 WinAPI 调用但没有成功:
GetParent(menuHWND) ; //returns null
GetWindow(menuHWND, GW_OWNER) ; //returns null
GetAncestor(menuHWND, GA_ROOTOWNER) ; //returns menuHWND
编辑:
我使用函数 WindowFromPoint
GetGUIThreadInfo
知道:
static DWORD CALLBACK MenuPeekerThread(LPVOID)
{
Sleep(1500); // Wait for menu to show because this is just a silly example
POINT pt = { 2, 2 };
HWND hwndMenu = WindowFromPoint(pt);
GUITHREADINFO gti = { sizeof(GUITHREADINFO), };
DWORD tid = GetWindowThreadProcessId(hwndMenu, NULL);
if (tid && GetGUIThreadInfo(tid, >i))
{
printf("owner is %p\n", gti.hwndMenuOwner);
}
return 0;
}
static void TestMenuThing(HWND hwnd)
{
CloseHandle(CreateThread(NULL, 0, MenuPeekerThread, NULL, 0, NULL));
HMENU hMenu = CreatePopupMenu();
AppendMenu(hMenu, 0, 1, TEXT("Foo"));
AppendMenu(hMenu, 0, 1, TEXT("Bar"));
TrackPopupMenu(hMenu, 0, 0, 0, 0, hwnd, NULL);
DestroyMenu(hMenu);
}
GetGUIThreadInfo
是在 Windows 2000 中添加的,如果你需要支持任何更旧的东西,你需要一个 hook 并在为 [=18] 调用挂钩时比较 HMENU 参数=] 消息。