我有我写了一个小精灵的应用程序。它通过移动鼠标到适当的按钮,菜单和点击它们,以便用户可以观看自动化应用的一小部分。

到目前为止,这将鼠标移动到一个树项目,并发送一个单击鼠标右键。弹出通过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 钩。我觉得它的设计做的正是你仿佛是试图做手工。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top