Domanda

Ho un'app per la quale sto scrivendo un piccolo mago. Ha automatizzato una piccola parte dell'app spostando il mouse su pulsanti, menu e facendo clic su di essi in modo che l'utente possa guardarlo.

Finora sposta il mouse su un elemento dell'albero e invia un clic con il tasto destro. Viene visualizzato un menu tramite TrackPopupMenu. Quindi sposto il mouse sulla voce appropriata nel menu a comparsa. Quello che non riesco a capire è come selezionare la voce di menu.

Ho provato a inviare clic con il tasto sinistro del mouse sulla finestra del proprietario del menu, ho provato a inviare WM_COMMAND al proprietario del menu, ecc. Non funziona nulla.

Suppongo che il menu sia una finestra in sé e per sé, ma non so come ottenere l'HWND per esso dall'HMENU che ho.

Qualche idea su come postmessaggio un clic sul menu popup?

PS Sto usando un thread separato per guidare il mouse e pubblicare messaggi, quindi nessun problema con TrackPopupMenu in modo sincrono.

È stato utile?

Soluzione

Non ho trovato un modo perfetto per farlo, ma quanto segue funziona abbastanza bene:

//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 funzione sopra è stata chiamata facendo clic con il tasto destro del mouse sull'albero. Il sotto il codice viene eseguito in un thread separato per fare il 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);
}

Altri suggerimenti

Mi aspetto che tu possa generare i messaggi di clic necessari chiamando SendInput . Spostare il mouse su dove si trova il menu, quindi fare clic.

Potresti dare un'occhiata al WH_JOURNALPLAYBACK . Penso che sia progettato per fare esattamente quello che sembra stia cercando di fare manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top