重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

アプリ作成で悩んでいます。

【やりたいこと】
  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#(バージョン問わず)

大変困っています。
実現可能/不可能だけでも結構ですので、
もしご存知の方がいらっしゃいましたら
ご教授の程、宜しくお願い致します。

A 回答 (2件)

無理っぽい気がします …



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

そのアプリの開発元に確認してみましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/16 22:24

Excelのメニューは Office独自のコマンドバーで実装されています



『Visual Studio Tools for Office(VSTO)』経由か
COM+経由で Excel.exe を参照設定して 行うことになりそうです

COM+経由の場合Excelに起動/終了も管理するのであれば参照オブジェクトの開放をしっかりやらないと Excelのプロセスがシステム上に残ってしまうことがあります

『C#.NET EXCEL オートメーション』などをキーワードに検索してみましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/13 03:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!