我有一个应用程序,我正在写一个小巫师。它通过将鼠标移动到适当的按钮,菜单并单击它们以便用户可以观看来自动化应用程序的一小部分。
到目前为止,它将鼠标移动到树项并发送右键单击。这会通过TrackPopupMenu弹出一个菜单。接下来,我将鼠标移动到弹出菜单上的相应项目。我无法弄清楚如何选择菜单项。
我尝试向菜单的所有者窗口发送左键单击,尝试将WM_COMMAND发送到菜单的所有者等等。没有任何作用。
我认为菜单本身就是一个窗口,但我不知道如何从我拥有的HMENU获取HWND。
有关如何将ClickMessage点击进入弹出菜单的任何想法?
PS我正在使用一个单独的线程来驱动鼠标并发布消息,因此TrackPopupMenu没有同步问题。
答案 0 :(得分:2)
我没有找到完美的方法,但以下工作得很好:
//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);
}
答案 1 :(得分:1)
我希望您可以通过致电SendInput
来生成必要的点击消息。将鼠标移到菜单所在的位置,然后单击。
您可能需要查看WH_JOURNALPLAYBACK挂钩。我认为它的设计目的就是你想要手动完成的事情。