Como programaticamente selecionar item de menu pop-up no Windows?
-
11-07-2019 - |
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.
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.