2

私は小さなウィザードを書いているアプリを持っています。マウスを適切なボタンやメニューに移動してクリックすることで、アプリの小さな部分を自動化し、ユーザーが見ることができるようにしました。

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

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

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

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

PS マウスの駆動とメッセージの投稿に別のスレッドを使用しているため、TrackPopupMenu が同期していても問題はありません。

4

2 に答える 2

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);
}
于 2008-11-28T20:31:55.903 に答える
1

を呼び出すことで、必要なクリック メッセージを生成できると思いますSendInput。メニューがある場所にマウスを移動し、クリックします。

WH_JOURNALPLAYBACKフックを確認することをお勧めします。手動でやろうとしているように見えることを正確に行うように設計されていると思います。

于 2008-11-26T03:10:15.677 に答える