掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
自作アプリ以外からExcelを閉じた時の残骸を無くすには? (ID:29811)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
//---------------- // 本体プログラム //---------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComObj, StdCtrls, ProcessServiceUnit; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private public procedure ApplicationMessage(var Message: TMSG; var Handled: Boolean); end; var Form1: TForm1; CBTModuleHandle: HModule; WM_WINDOWDESTROY: UINT; SaveWinProc: TWndMethod; Excel: Variant; WorkBook: Variant; WorkSheet: Variant; ExcelWindowHandle : HWND; procedure SetCBTHook;stdcall;external 'CBTHook.dll' name 'SetCBTHook'; procedure UnHookCBTHook;stdcall; external 'CBTHook.dll' name 'UnHookCBTHook'; implementation {$R *.dfm} procedure TForm1.ApplicationMessage(var Message: TMSG; var Handled: Boolean); var List: TStringList; I : Integer; begin if Message.message = WM_WINDOWDESTROY then begin if Message.WParam = ExcelWindowHandle then begin List:=TStringList.Create; GetProcessList(List); I := Integer(List.Objects[List.IndexOf('EXCEL.EXE')]); if I<>-1 then ProcessTerminate(I); List.Free; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var SaveCaption : String; begin if OpenDialog1.Execute = True then begin Excel := CreateOleObject('Excel.Application'); SaveCaption := Excel.Caption; ExcelWindowHandle := FindWindow(nil,PChar(SaveCaption)); Excel.Caption := SaveCaption; WorkBook :=Excel.WorkBooks.Open(FileName := OpenDialog1.FileName , readOnly := False); WorkSheet := WorkBook.WorkSheets[1]; Excel.Visible:= True; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UnHookCBTHook; try WorkBook.close; WorkBook:=unAssigned; WorkSheet:=unAssigned; except end; try Excel.Quit; Excel:=unAssigned; except end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := ApplicationMessage; WM_WINDOWDESTROY := RegisterWindowMessage('CBTWindowDestroy'); SetCBTHook; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.