Pregunta

Tengo una aplicación para la que escribo un pequeño asistente. Automatizó una pequeña parte de la aplicación moviendo el mouse a los botones, menús y haciendo clic en ellos para que el usuario pueda verlos.

Hasta ahora mueve el mouse a un elemento de árbol y envía un clic derecho. Eso abre un menú a través de TrackPopupMenu. A continuación muevo el mouse al elemento apropiado en el menú emergente. Lo que no puedo entender es cómo seleccionar el elemento del menú.

Intenté enviar clics izquierdos a la ventana del propietario del menú, intenté enviar WM_COMMAND al propietario del menú, etc. Nada funciona.

Supongo que el menú es una ventana en sí mismo, pero no sé cómo obtener el HWND del HMENU que tengo.

¿Alguna idea sobre cómo publicar un mensaje en el menú emergente?

PD: Estoy usando un hilo separado para mover el mouse y publicar mensajes, así que no hay problemas con TrackPopupMenu siendo síncrono.

¿Fue útil?

Solución

No encontré una forma perfecta de hacerlo, pero lo siguiente funciona bastante 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 función anterior se llamó al hacer clic con el botón derecho en el elemento del árbol. El siguiente el código se ejecuta en un hilo separado para hacer 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);
}

Otros consejos

Espero que pueda generar los mensajes de clic necesarios llamando a SendInput . Mueva el mouse sobre dónde está el menú y luego haga clic.

Es posible que desee echar un vistazo al WH_JOURNALPLAYBACK . Creo que está diseñado para hacer exactamente lo que parece estar intentando hacer manualmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top