如何获取弹出菜单的所有者窗口

问题描述 投票:0回答:1

打开弹出菜单时,使用TrackPopupMenu函数,该函数将参数“作为拥有菜单的窗口的句柄”。

我想知道屏幕上可见的任何弹出菜单的所有者窗口是什么。

是否有可能获得这样的窗口的句柄,即使它属于另一个进程?

我已经尝试了以下WinAPI调用但没有成功:

GetParent(menuHWND) ; //returns null
GetWindow(menuHWND, GW_OWNER) ; //returns null
GetAncestor(menuHWND, GA_ROOTOWNER) ; //returns menuHWND

编辑: 我使用WindowFromPoint函数获取菜单句柄

windows winapi popupmenu
1个回答
2
投票

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, &gti))
  {
    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,并在为WM_INITMENU / WM_INITMENUPOPUP消息调用钩子时比较HMENU参数。

© www.soinside.com 2019 - 2024. All rights reserved.