質問

小さなウィザードを作成しているアプリがあります。マウスを適切なボタン、メニューに移動してクリックすることで、ユーザーが視聴できるようにアプリの一部を自動化しました。

これまでのところ、マウスをツリー項目に移動し、右クリックを送信します。 TrackPopupMenuを介してメニューがポップアップします。次に、ポップアップメニューの適切な項目にマウスを移動します。私が理解できないのは、メニュー項目を選択する方法です。

メニューの所有者ウィンドウに左クリックを送信しようとしました。メニューの所有者にWM_COMMANDを送信しようとしました。何も動作しません。

メニューはそれ自体がウィンドウであると思いますが、私が持っているHMENUからHWNDを取得する方法がわかりません。

ポップアップメニューのクリックをPostMessageする方法について何か考えはありますか?

PS別のスレッドを使用してマウスを駆動し、メッセージを送信するので、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