開発環境
windows 2000
Excel 2000
Visual Studio .NET 2003
wisteriaと申します。
自作アプリからエクセルを操作する方法で質問があります。
http://support.microsoft.com/kb/308407/
を参考にし、タイプライブラリを使用しセルの読み書きができる
ところまでできました.
ここで質問なんですが、
アプリがエクセルを操作しているときは、
ユーザがエクセルを終了できなくする方法はありますでしょうか。
またはユーザがエクセルを終了したことをアプリは
イベントとして受け取ることはできるでしょうか。
以上よろしくお願いします。
終了イベントはライブラリにありそうな気がするけど、WindowsAPIで
WaitForSingleObjectにエクセルのプロセスハンドル放り込んで終了しているか
チェックする事は出来る。
終了阻止は出来ても、タスクマネージャなどからの強制終了はほぼ阻止不可能
だと考えたほうがいいしそこまでするべきじゃない。
ハングアップと勘違いされて強制終了されるのは無理だと思うから目的次第じゃ
ないかと思う。
> またはユーザがエクセルを終了したことをアプリは
> イベントとして受け取ることはできるでしょうか。
カナリ面倒です。
WordやPPなら簡単にイベント拾えるけど、Excelの場合は簡単には出来ません。
参考
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40311&forum=7
というか、普通はそういうことをやりたいのであればExcel主体つまりExcel VBAにすべ
きでしょう。
VC++から使う場合は単なるxlsファイル作成用みたないな感じで使わないとすべてを面倒
見るのは至難でしょうね。
# 見当外れの回答でしたら無視してください。
>> BUG: ATL COM イベント ハンドラは、逆順序で引数を受信することがあります。
> http://support.microsoft.com/kb/288724/ja
タイトルはATLCOMに対するバグ資料ですが、中身はWorkbookBeforeClose()の
サンプルです。
(VC++2003では直ってるっぽいです)
Bookの終了(否、アプリの終了)は取れますが、それがユーザーからなのか、
アプリからなのかを判断するには更に細工が必要だと思われます。
> アプリがエクセルを操作しているときは、
> ユーザがエクセルを終了できなくする方法はありますでしょうか。
このようなパターンって大抵、アプリ操作対象のExcel自体が非表示な気がします。
(仕様上のことになってくるのでツッコんでも仕方がないですが・・)
>このようなパターンって大抵、アプリ操作対象のExcel自体が非表示な気がします。
一個前の質問が
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200709/07090022.txt
だったので、Excel自体は表示しているものと思っています。
それとBookを非表示にしていても多分WorkbookBeforeCloseイベントは取れますので、
Bookを開いていさえすればとりあえずは抑制はできるんじゃないかなぁと。
一個目のスレッドがあったのですね orz
> Bookを非表示にしていても多分WorkbookBeforeCloseイベントは取れますので、
MSのサンプルで確認したところ、Excelが非表示、MsgBoxのみが表示、という
状態になりました。(もちろん、イベント自体も取れてます)
Excel自体が表示されているとすると、複数Bookのオープン状態自体も加味
しないといけないのカナ・・・。
(対応イベントがWorkbookOpenだと思うのですが、開いた後のようですね。)