Pergunta

Eu tenho um aplicativo que eu estou escrevendo um pequeno assistente para. Ele automatizado uma pequena parte do aplicativo, movendo o mouse para botões apropriados, menus e clicando-los de modo que o usuário pode assistir.

Até agora ele se move o mouse para um item de árvore e envia um clique com o botão direito. Que aparece um menu via TrackPopupMenu. Em seguida eu mover o mouse para o item apropriado no menu pop-up. O que eu não consigo entender é como selecionar o item de menu.

Eu tentei enviar cliques esquerda para a janela do proprietário do menu tentei enviar WM_COMMAND para o dono do menu, etc. obras Nada.

Suponho que o menu é uma janela em si, mas eu não sei como obter o HWND para ele a partir do HMENU que eu tenho.

Todos os pensamentos sobre como PostMessage um clique para o menu pop-up?

PS Eu estou usando um segmento separado para conduzir o mouse e postar mensagens, assim, não problemas com TrackPopupMenu sendo síncrona.

Foi útil?

Solução

Eu não encontrar uma maneira de prefeito de fazê-lo, mas a seguir funciona muito bem:

//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;

A função acima foi chamado em um clique com o botão direito do item da árvore. O abaixo código é executado em um segmento separado para fazer o clique

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);
}

Outras dicas

Eu espero que você poderia gerar as mensagens de clique necessárias chamando SendInput . Passe o mouse sobre onde o menu é, e então clique.

Você pode querer dar uma olhada na WH_JOURNALPLAYBACK gancho . Eu acho que ele é projetado para fazer exatamente o que você parece estar tentando fazer manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top