- PR -

ファイル名の取得

1
投稿者投稿内容
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-02-02 11:33
VC++にて
Windowsのデスクトップ上にあるタスクバーに駐屯したExcelファイルの名前を取得したいと思っています。

これを行うのに便利な関数や方法をご存知でしたら教えていただきたいです。

よろしくお願いします。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-02 13:00
こんにちは。

すこし確認と前提事項があります。

・タスクバーに限る話ですか?

・ファイル名とおっしゃっているのは、ファイルを開いたときのデフォルトが
「Microsoft Excel- "ファイル名"」だからでしょうか?


厳密にはタイトルバーの表示は、EXCELがデフォルトで上記の動作をするだけ、
任意に他からもタイトルバーのテキスト表示は変更できてしまいます。

とりあえず、EXCELが1つだけ起動している場合のタイトルバーの取得ならと仮定しますが、
普通にウィンドウのタイトルを取得するはどうでしょうか?

FindWindow()--で、ウィンドウクラス名を”XLMAIN”でウィンドウハンドルを取得
GetWindowTextLength() --で、ウィンドウのタイトルの文字列長を取得
GetWindowText() ---タイトルの文字列長の文字バッファ確保して、タイトルを取得。

各APIについてはAPIの仕様を調べたらわかると思いますが、いかがでしょう?
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-02-02 13:43
お返事ありがとうございます。

Excelは複数のファイルがタスクバー上に存在しても
それをリストボックス形式でドロップダウンし、開いているファイル分だけ取得して、そこに現在あるExcelファイルの名前を表示したいと思っています。

Excelファイルが保存してあっても、保存してなくってもタスクバー上にあればタイトル
を表示させたいと思ってます。

xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-02 16:48
私がVB6->.NET C#のユーザーなので、C++の経験がほとんど無いのですが、
思いつくままに簡単な方法の提案です。

FindWindowEx()を使って、クラス名を”MS-SDIa"にして、
無限ループで
-----------------------
・FindWindowEx()←最初の親ハンドルはnullで、2ループ以降は取得したウィンドウハンドル
・GetWindowTextLength()
・GetWindowText()

・・・リストに追加
----------------------------
 
FindWindowEx()取得ハンドルがNULLになるまで順次まわして、
breakするのはどうですか?

ただし、EXCEL2000〜2003でしかクラス名は確認してません。
ウィンドウクラス名が、"MS-SDIa"で
今後も変わらず保持されるかはマイクロソフト社次第です。
(※EXCLE7では使えないようです。)

っと、言う噂を聞いて調べましたが、似たようなことをVBでやっている人がいました。
http://www.mrexcel.com/archive2/72800/84492.htm

私はVBでしか書いてないですが、一応目的の動作はしました。
APIの使い方は論理的には正しいようなので、C++でも動くと思います。
他にも方法があるような気もしますが・・。
ちょっとレアな手法かもしれません。



[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-02 16:51 ]
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2005-04-04 18:59

しばらく間が開いてしまいました。すいません。
回答ですが、シート名も含めて起動中のExcelを取得することが
可能でした。

やり方ですが、
Excelは複数のインスタンスを発行できるアプリケーションですので
その辺が非常にめんどくさいことになります。
詳細は以下をご覧ください。

http://support.microsoft.com/kb/190985

ここでのやり方はOLEオートメーションによるExcelの取得方法です。
これで、シート名まで取得が可能です。

さらにこれに続けて、ハンドルを取得するということも必要になります。
ハンドルは以下をご覧ください。

http://support.microsoft.com/default.aspx?scid=kb;ja;258511

ここで必要なウインドウクラスはMS-SDIaだけでなく、Excel7など
Excelが持っているウインドウクラスをフルフルで活用することになります。

これらはななおさんと同じやり方でとってくることになりますが、findwindowex
関数はExcelのTOPウインドウから孫ウインドウまですべてを考えに入れる必要がありました。

これで完璧にシート名まで取得可能です。
プログラムについては長くなるので割愛しますが、
一応複数インスタンスも複数ブックがあがっていても問題なく取得できます。

xxななおxx様ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)