代码之家  ›  专栏  ›  技术社区  ›  GetFree

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

  •  2
  • GetFree  · 技术社区  · 8 年前

    打开弹出菜单时,使用该功能 TrackPopupMenu ,作为参数“ 拥有菜单的窗口的句柄 ".

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

    即使该窗口属于另一个进程,也有可能获得该窗口的句柄吗?

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

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

    编辑:
    我通过函数获得菜单句柄 WindowFromPoint

    1 回复  |  直到 8 年前
        1
  •  4
  •   Anders    8 年前

    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\u INITMENU/WM\u INITMENUPOPUP消息调用钩子时,比较humenu参数。