문제

약간의 마법사를 작성하는 앱이 있습니다. 마우스를 적절한 버튼, 메뉴로 이동하여 사용자가 볼 수 있도록 앱의 작은 부분을 자동화하여 클릭했습니다.

지금까지 마우스를 트리 항목으로 옮기고 마우스 오른쪽 버튼을 클릭합니다. 그것은 trackpopupmenu를 통해 메뉴를 나타냅니다. 다음으로 마우스를 팝업 메뉴의 적절한 항목으로 옮깁니다. 내가 알아낼 수없는 것은 메뉴 항목을 선택하는 방법입니다.

메뉴의 소유자 창으로 왼쪽 클릭을 보내려고했는데 메뉴의 소유자에게 wm_command를 보내려고했습니다.

나는 메뉴가 그 자체로 창이라고 생각하지만, 내가 가지고있는 hmenu에서 HWND를 얻는 방법을 모른다.

팝업 메뉴를 클릭하는 방법에 대한 생각이 있습니까?

추신 : 마우스를 구동하고 메시지를 게시하기 위해 별도의 스레드를 사용하고 있으므로 TrackPopupMenu가 동기화되는 데 아무런 문제가 없습니다.

도움이 되었습니까?

해결책

나는 그것을 할 수있는 방법을 찾지 못했지만 다음은 잘 작동합니다.

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

위의 기능은 트리 항목을 마우스 오른쪽 버튼으로 클릭하여 호출되었습니다. 아래 코드는 클릭을 수행하기 위해 별도의 스레드에서 실행됩니다.

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

다른 팁

나는 당신이 전화를 통해 필요한 클릭 메시지를 생성 할 수 있다고 기대합니다. SendInput. 마우스를 메뉴의 위치로 이동 한 다음 클릭하십시오.

당신은 그것을보고 싶을 것입니다 wh_journalplayback 훅. 나는 그것이 당신이 수동으로하려고하는 것처럼 보이도록 설계되었다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top