Вопрос

У меня есть приложение, для которого я пишу маленького мастера. Он автоматизировал небольшую часть приложения, перемещая мышь к соответствующим кнопкам, меню и щелкая их, чтобы пользователь мог наблюдать.

Пока что он перемещает мышь к элементу дерева и посылает щелчок правой кнопкой мыши. Это выскакивает меню через TrackPopupMenu. Затем я перемещаю мышь к соответствующему пункту во всплывающем меню. Что я не могу понять, так это как выбрать пункт меню.

Я попытался отправить левые клики в окно владельца меню, попытался отправить WM_COMMAND владельцу меню и т. д. Ничего не работает.

Полагаю, меню само по себе является окном, но я не знаю, как получить HWND для него из HMENU, который у меня есть.

Есть мысли о том, как отправить сообщение, нажав на всплывающее меню?

PS Я использую отдельную ветку, чтобы управлять мышью и публиковать сообщения, поэтому никаких проблем с синхронизацией 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