1

我有一個應用程序,我正在寫一個嚮導。它通過將鼠標移動到適當的按鈕,菜單並點擊它們以使用戶可以觀看來自動化應用程序的一小部分。如何以編程方式選擇Windows中的彈出菜單項?

到目前爲止,它將鼠標移動到樹項目併發送右鍵單擊。通過TrackPopupMenu彈出一個菜單。接下來,我將鼠標移動到彈出式菜單上的相應項目。我無法弄清楚的是如何選擇菜單項。

我試着將左鍵單擊發送到菜單的所有者窗口,嘗試將WM_COMMAND發送給菜單的所有者,等等。

我想菜單本身就是一個窗口,但我不知道如何從HMENU獲取HWND。

有關如何將PostMessage單擊到彈出式菜單的任何想法?

PS我正在使用一個單獨的線程來驅動鼠標和發佈消息,所以TrackPopupMenu沒有同步問題。

回答

2

我沒有找到一個知府方式做到這一點,但下面的作品相當不錯:

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

我希望你可以通過致電SendInput生成必要的點擊消息。將鼠標移到菜單所在的位置,然後單擊。

您可能想看看WH_JOURNALPLAYBACK鉤子。我認爲它的設計是爲了完成你似乎正在嘗試手動完成的事情。

相關問題