質問: 32868 Call PostMessage(hWinMerge, WM_COMMAND, wID, 0&) End Function ```
回答: 当面の目的の操作はWinMergeの「ツール(T)」-->「レポート作成(R)」とメニュー選択することで良いでしょうか。 そうだとすると、`PostMessage`で`WM_COMMAND`を送るときのパラメーターが違います。最終的に必要なメニュー指定は「レポート作成(R)」で、これを選択したときに`WM_COMMAND`がメインのウィンドウへ送られます。このときの`WM_COMMAND`のパラメータは、WPARAMがメニューハンドルではなくメニューIDで、LPARAMが0になります。 Microsoft Docs - WM_COMMAND message 手持ちのWinMerge(2.4.10.0 Unicode ※日本語化はしていません) をSpy++で確認した限りですが、このメニューIDは32868でした。 ちなみにExcelVBAではありませんが、Win32 ネイティブ(32ビット)の外部プログラムから以下のコードで「レポート作成(R)」メニューを選択したときのファイル選択ダイアログボックスを出すことができました。 ``` // うまく動かないときは各APIの返り値をチェックしてください。 HWND hwnd = ::FindWindow(_T("WinMergeWindowClassW"), NULL); if (hwnd != NULL) { WPARAM wParam = MAKEWPARAM(32868, 0); LPARAM lParam = 0; BOOL b = ::PostMessage(hwnd, WM_COMMAND, wParam, lParam); ATLTRACE2(_T("b=%d\n"), b); } ``` ただ、最終的にやりたい操作がWinMergeのコマンドラインオプションのみならず、上記でもこなせかったり、更に`SendKeys`でも難しい場合はUIAutomationの機能を使ったり、UiPathなどのRPA製品を使ったほうが良いかもしれません。