2

我有一个应用程序,我正在为其编写一个小向导。它通过将鼠标移动到适当的按钮、菜单并单击它们来自动化应用程序的一小部分,以便用户可以观看。

到目前为止,它将鼠标移动到树项目并发送右键单击。通过 TrackPopupMenu 弹出一个菜单。接下来,我将鼠标移动到弹出菜单上的相应项目。我不知道如何选择菜单项。

我尝试将左键单击发送到菜单的所有者窗口,尝试将 WM_COMMAND 发送到菜单的所有者等。没有任何效果。

我想菜单本身就是一个窗口,但我不知道如何从我拥有的 HMENU 中获取它的 HWND。

关于如何 PostMessage 单击弹出菜单有什么想法吗?

PS 我使用单独的线程来驱动鼠标和发布消息,所以 TrackPopupMenu 同步没有问题。

4

2 回答 2

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);
}
于 2008-11-28T20:31:55.903 回答
1

我希望您可以通过调用来生成必要的点击消息SendInput。将鼠标移到菜单所在的位置,然后单击。

您可能想看看WH_JOURNALPLAYBACK挂钩。我认为它旨在完全执行您似乎想要手动执行的操作。

于 2008-11-26T03:10:15.677 回答