1

У меня есть приложение, для которого я пишу маленький волшебник. Он автоматизировал небольшую часть приложения, перемещая мышь на соответствующие кнопки, меню и нажимая на них, чтобы пользователь мог смотреть.Как программно выбрать пункт всплывающего меню в Windows?

Пока он перемещает мышь в элемент дерева и отправляет щелчок правой кнопкой мыши. Это вызывает меню через TrackPopupMenu. Затем я перемещаю мышь в соответствующий элемент во всплывающем меню. Я не могу понять, как выбрать пункт меню.

Я попытался отправить левые клики в окно владельца меню, попытался отправить WM_COMMAND владельцу и т. Д. Ничего не работает.

Я полагаю, что меню - это окно само по себе, но я не знаю, как получить HWND для него из HMENU, который у меня есть.

Любые мысли о том, как отправить сообщение в контекстное меню?

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. Я думаю, что он предназначен для того, чтобы делать то, что вы пытаетесь сделать вручную.

 Смежные вопросы

  • Нет связанных вопросов^_^