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