Question

J'ai une application pour laquelle j'écris un petit sorcier. Il a automatisé une petite partie de l'application en déplaçant la souris sur les boutons et les menus appropriés, puis en cliquant dessus afin que l'utilisateur puisse regarder.

Jusqu'à présent, il déplace la souris vers un élément de l'arborescence et envoie un clic droit. Cela ouvre un menu via TrackPopupMenu. Ensuite, je déplace la souris sur l'élément approprié du menu contextuel. Ce que je n'arrive pas à comprendre, c'est comment sélectionner l'élément de menu.

J'ai essayé d'envoyer des clics gauche dans la fenêtre du propriétaire du menu, d'envoyer WM_COMMAND au propriétaire du menu, etc. Rien ne fonctionne.

Je suppose que le menu est une fenêtre en soi, mais je ne sais pas comment obtenir le HWND pour cela du HMENU que j'ai.

Avez-vous des idées sur la façon de poster un message dans le menu contextuel?

PS J'utilise un autre thread pour piloter la souris et publier des messages, donc aucun problème de TrackPopupMenu étant synchrone.

Était-ce utile?

La solution

Je n'ai pas trouvé de méthode parfaite pour le faire, mais cela fonctionne plutôt bien:

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

La fonction ci-dessus a été appelée par un clic droit sur l'élément de l'arborescence. Le dessous le code est exécuté dans un thread séparé pour faire le clic

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

Autres conseils

J'espère que vous pourrez générer les messages de clic nécessaires en appelant SendInput . Déplacez la souris sur l'emplacement du menu, puis cliquez sur.

Vous pouvez consulter le WH_JOURNALPLAYBACK . . Je pense que cela a été conçu pour faire exactement ce que vous semblez essayer de faire manuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top