用delphi怎么关闭powerpoint,直接关闭而不要出现保存提示。(200)

  • 主题发起人 likingzhe
  • 开始时间
L

likingzhe

Unregistered / Unconfirmed
GUEST, unregistred user!
例如: 我要关闭幻灯片3.ppt文件 //关闭 HWndStr:=FindWindow(nil,'Microsoft PowerPoint - [3.ppt]'); if HWndStr <>0 then SendMessage(HWndStr,WM_CLOSE,0,0); 这样写完,powerpoint会出现保存提示,而我不需要保存只要直接退出,请大家帮帮我!
 
这是相当于在任务管理器结束进程的api:TerminateProcess
 
恩,结束进程是可以的,但不是我所需要的。谢谢我要的就是在出现提示窗口的时候,想办法能直接‘退出去’,进程里的‘powerpnt’还是保存的,你就当我有2个幻灯片在播放吧,而我只想关闭其中的一个。
 
HWndStr:=FindWindow(nil,'Microsoft PowerPoint - [3.ppt]'); if HWndStr <>0 then SendMessage(HWndStr,WM_CLOSE,0,0); [red]sendmessage(HWndStr,WM_ENDSESSION,0,0); [/red]
 
?请教‘de410’大名,你说的方法可以实现我的要求吗,我试过了,还是不可以的。请指教!
 
TerminateProcess(openprocess(),0);
 
谢谢大家帮忙!!! 我解决了这个问题,虽然不是前面说的那样对‘提示框’进行了操作。这个问题,我还是留下,分数是一定要送出去的。希望大家帮我解决‘正统’的操作方法。如果有需要,我会告诉我的方法的。
 
我这边测试通过~~procedure TForm1.Button1Click(Sender: TObject);var Temp:HWND;begin temp:=FindWindow(nil,pchar('Microsoft PowerPoint - [演示文稿1]')); sendmessage(temp,WM_CLOSE,0,0); sendmessage(temp,WM_ENDSESSION,0,0);end;
 
killPointfunction KillExcel: boolean;var //必须TlHelp32单元 hSnapshot: THandle; //用于获得进程列表 lppe: TProcessEntry32; //用于查找进程 Found: Boolean; //用于判断进程遍历是否完成 KillHandle: THandle; //用于杀死进程begin hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获得系统进程 lppe.dwSize := SizeOf(TProcessEntry32); //在调用Process32First API之前, Found := Process32First(hSnapshot, lppe); //将进程列表的第一个进程信息读入lppe while Found do begin if CompareText('Excel.exe', lppe.szExeFile) = 0 then //判断该进程是否为金 begin // if MessageBox(0, '发现了金山词霸进程,是否终止该进程?', '发现进程', MB_YESNO) = IDYES then KillHandle := OpenProcess(PROCESS_TERMINATE, False, lppe.th32ProcessID); TerminateProcess(KillHandle, 0); //强制关闭进程 CloseHandle(KillHandle); end; Found := Process32Next(hSnapshot, lppe); //将进程列表的下一个进程信息读入 end; result := true;end;
 
谢谢‘de410’,你说的方法,我反复测试了,是可以的,呵呵,但并不适合我。你的方法用在程序打开powpoint的时候,还是会存在‘保存’提示的,这个我测试多遍了。在单独打开powerpoint的时候,能做到关闭幻灯片,但速度有点慢点。
 
恩,谢谢大家对问题的关心,分数会在下周送出,我们只要更多的方法,更多的技巧,更多的伙伴!
 
呵呵,在次提醒下大家,杀进程的方式,我现在是不需要的。所以大家还是开动脑筋,看看有没有更好的方法。
 
那简单, hook 程序,不让它弹出对话框,然后返回否.要代码就算了.
 
没装ppt,office不是都提供com接口吗?看里面有没有相关的函数可以放弃所有修改,然后再关闭?
 
如果要按你的思路来做的话,就需要用到OleDelphi与Office之种种~~ http://www.delphibbs.com/keylife/iblog_show.asp?xid=7538以下摘自上面文章要调用Office里面的按钮事件,实际上是需要连接到按钮事件的IDispatch接口。按钮接口的定义在Office2000.pas文件中。要连接到这些接口,你须自己编写Invoke方法。但是有些难度,我曾经试了一下,但是不成功。但是今天在http://www.techvanguards.com/看到有一个软件叫eventsinkimp,可以自动生成连接Com事件的组件,立马下载了一个(现在是2.0版)。 安装完了运行,发现可以Import Type Library,和Delphi一样,但是下面可以选择跟踪那一个COM的事件。于是选择:MicroSoft Office Object Library9.0,然后选择一个相应的接口。生成三个文件:Office_TLB,OfficeEvents和Office_TLB.dcr。 然后回到delphi,Install Component,在ACTIVEX里面出现了几个控件:TOfficeCommandBarButtonEvents等,这就是我们想要的!!!里面有click事件。 接下来就简单了,先建立一个Bar然后建立一个Commandbarbutton,然后调用TOfficeCommandBarButtonEvents.connect方法把我们刚才建立的Commandbarbutton连接起来,这样就可以了!!! 注意:安装了windows installer 2.0的同志恐怕麻烦一点,安装不上去,害得我重装了系统,哪位解决了的通知我一声。————————————————————//试试下面刚写的.如果你要用Delphi带的组件,省去常量声明,取对你有用的那段就行了,GoodLuck!uses ComObj;procedure DocPageSetup(const DocFileName: string);const [red]wdAlertsNone = $00000000;[/red] wdDialogFilePageSetup = $000000B2;var DocApp: OleVariant;begin try try DocApp := CreateOleObject('Word.Application'); [red]DocApp.DisplayAlerts := wdAlertsNone;[/red]//取消保存提示 DocApp.Documents.Open(DocFileName); DocApp.Dialogs.Item(wdDialogFilePageSetup).Show; DocApp.Visible := False; DocApp.ActiveDocument.Save; except end; finally if not VarIsEmpty(DocApp) then DocApp.Quit; DocApp := Unassigned; end;end;
 
接受答案了.
 
顶部