如何以编程方式在Windows中选择弹出菜单中的项目?
-
11-07-2019 - |
题
我有我写了一个小精灵的应用程序。它通过移动鼠标到适当的按钮,菜单和点击它们,以便用户可以观看自动化应用的一小部分。
到目前为止,这将鼠标移动到一个树项目,并发送一个单击鼠标右键。弹出通过TrackPopupMenu的菜单。接下来,我将鼠标移动到合适的项目在弹出菜单中。我想不通的是如何选择菜单项。
我试过送左点击该菜单的所有者窗口,试图发送WM_COMMAND到菜单的所有者,等没有什么工作。
我想菜单本身就是一个窗口,但我不知道如何从我有HMENU得到HWND它。
如何PostMessage的一个点击弹出菜单有什么想法?
PS我使用一个单独的线程来驱动鼠标和POST消息,所以用TrackPopupMenu是同步没有任何问题。
解决方案
我没有找到一个知府方式做到这一点,但下面的作品相当不错:
//in my case, the menu is a popup from a tree control created with:
CMenu menu;
menu.CreatePopupMenu();
//add stuff to the menu...
pTreeCtrl->SetMenu(&menu);
m_hMenu = menu.GetSafeHmenu();
CPoint pt;
GetCursorPos(&pt);
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, _pTreeCtrl);
menu.Detach();
m_hMenu = NULL;
上面的函数被调用树上项的右键单击。下面 代码被在一个单独的线程来执行的点击运行
CRect rc;
GetMenuItemRect(pTreeCtrl->GetSafeHwnd(), m_hMenu, targetMenuItemIndex, &rc);
if(FALSE == rc.IsRectEmpty())
{
CPoint target = rc.CenterPoint();
//this closes the menu
::PostMessage(pTreeCtrl->GetSafeHwnd(), WM_CANCELMODE, 0, 0);
DestroyMenu(m_hMenu);
m_hMenu = NULL;
//now simulate the menu click
::PostMessage(pTreeCtrl->GetSafeHwnd(), WM_COMMAND, targetMenuItemID, 0);
}
其他提示
我希望你可以生成调用 SendInput
一个必要的点击消息>。将鼠标移动到其中该菜单是,然后单击。
您可能想看看 WH_JOURNALPLAYBACK 钩。我觉得它的设计做的正是你仿佛是试图做手工。
不隶属于 StackOverflow