• 締切済み

EXCELのメニュー操作アプリ(C#)

アプリ作成で悩んでいます。 【やりたいこと】   EXCELを開くと、左上に[ファイル(F)],[編集(E)],[表示(V)]...   と並んでいるメニューがあり、   この中で[表示(V)]-[ツールバー(T)]を選択すると、   いくつかの項目にチェックが付いていると思います。   ※人によっては何もチェックが無い状態もあると思いますが・・・   ここで、私が作成したいアプリは、    「チェックされている箇所を判別して、         指定の箇所にチェックがなければ              指定の箇所にチェックを入れる」   です。 【試した方法】   通常のメモ帳や電卓等のメニューについては、   API(GetMenu、GetSubMenu、GetMenuItemInfo、SetMenuItemInfo等)   を用いて上記を実現できましたが、   EXCELはメニューの形式が異なるためなのか   GetMenuでウィンドウハンドルの取得が出来ませんでした。 下記はメモ帳のステータスバーチェック状態を調べて   チェックが無い場合にチェックするサンプルです。   EXCELのウィンドウハンドルからGetMenuを呼び出しても   メニューのウィンドウハンドルを取得することが   できませんでした。 //============================================== //フォームに紐づくメニューハンドル取得 //============================================== IntPtr hMenu = GetMenu(hWnd); //============================================== //サブメニューウィンドウハンドル取得 //============================================== IntPtr hSubMenu = GetSubMenu(hWnd,3); //============================================== //メニュー状態取得 //============================================== MENUITEMINFO mif = new MENUITEMINFO(); mif.cbSize = Marshal.SizeOf(typeof(MENUITEMINFO)); mif.fMask = MIIM_STATE; GetMenuItemInfo(hSubMenu,3,true,ref mif) //============================================== //チェック判定 //============================================== if(mif.fState != MFS_CHECKED) {//チェックなしの場合 //=========================== //メニュー状態変更 //=========================== MENUITEMINFO mif = new MENUITEMINFO(); mif.cbSize = Marshal.SizeOf(typeof(MENUITEMINFO)); mif.fMask = MIIM_STATE; mif.fState=MFS_CHECKED; SetMenuItemInfo(hSubMenu,3,true,ref mif) } 【開発言語】   C#(バージョン問わず) 大変困っています。 実現可能/不可能だけでも結構ですので、 もしご存知の方がいらっしゃいましたら ご教授の程、宜しくお願い致します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

無理っぽい気がします … VS.NETのツールの SPY++ でそのアプリを検索してプロパティを表示させます この中の『メニューハンドル』が 00000000 以外なら GetMenuなどでメニューが取得可能です ここが 00000000 なら そのアプリに表示されているメニューは そのアプリ独自の APIで制御されている可能性が大です そのアプリの開発元に確認してみましょう

calm_noisy
質問者

お礼

何度もお答えしていただき、ありがとうございます。 やはり無理っぽいですね。 今回はあきらめることにします。 また、何かわからないことがあればよろしくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Excelのメニューは Office独自のコマンドバーで実装されています 『Visual Studio Tools for Office(VSTO)』経由か COM+経由で Excel.exe を参照設定して 行うことになりそうです COM+経由の場合Excelに起動/終了も管理するのであれば参照オブジェクトの開放をしっかりやらないと Excelのプロセスがシステム上に残ってしまうことがあります 『C#.NET EXCEL オートメーション』などをキーワードに検索してみましょう

calm_noisy
質問者

お礼

ご返答が遅くなってしまい、大変申し訳ございません。 参照設定などを行わず、APIだけでの実装は不可能でしょうか? というのも、EXCELと同様のアプリ(メニューが同じ)を 想定していまして、実際にはEXCELではないためです。