8.9 如何在Authorware中关闭外部程序?
(本文选自《Authorware 多媒体设计专家门诊》,网上购买)
问题
有时需要在Authorware程序中调用其他应用程序打开某些文档,比如Word、PowerPoint、记事本、画图等等,打开这些程序后,最好可以再在Authorware程序中将他们关闭,使程序更加智能化,那如何做到在Authorware中关闭外部程序呢?
解决思路
在Authorware中关闭外部程序需要借助于用户自定义函数,常用的有Winapi.u32、ActiveM!.u32和Budapi.32中的函数,基本原理都是通过程序的类名和标题名获得程序窗口的句柄,然后用函数操作该句柄关闭程序窗口。
具体步骤
1. Winapi.u32
在使用Winapi.u32实现关闭外部程序窗口时,需要使用到的相关函数是FindWindow()和PostMessage()。FindWindow()函数的作用是通过程序类名和窗口标题名两个参数来获取目标程序窗口的句柄,PostMessage()函数的作用是向获取的句柄对应的目标程序发送关闭窗口的指令。例如使用语句JumpOutReturn("notepad.exe", FileLocation^"demo.txt")打开了程序目录下的一个文本文件,然后使用语句Handle:=FindWindow("Notepad" , "demo.txt - 记事本")获取目标程序窗口的句柄并存储在变量Handle中,其中“Notepad”为记事本程序的类名,“demo.txt - 记事本”为程序窗口的标题名;最后使用语句PostMessage(Handle,274,61536,0)即可关闭目标程序窗口,如果文件被修改,则将显示保存文件对话框。
提示:每一种程序窗口都有一个类名,这个是由开发该程序的程序员指定的,比如Authorware的类名为"APWMainClass",常用程序的类名参见表8-1。
表8-1 常用程序的类名
|
程 序 名 称 |
类 名 |
|
Authorware |
APWMainClass |
|
Director |
ASIMainWndClass |
|
Flash |
SmartSketchMDIFrame |
|
Dreamweaver |
_macr_dreamweaver_frame_window |
|
Fireworks MX |
Fireworks_MX_MainWindow |
|
Photoshop |
Photoshop |
|
Explorer |
CabinetWClass |
|
Microsoft Internet Explorer |
IEFrame |
|
Microsoft Word XP |
OpusApp |
|
Microsoft Excel XP |
XLMAIN |
|
Microsoft Powerpoint XP |
PP10FrameClass |
|
Microsoft Access XP |
OMain |
|
Microsoft Visio 2002 |
VISIOA |
|
记事本 |
Notepad |
|
写字板 |
WordPadClass |
|
画图 |
MSPaintApp |
|
计算器 |
SciCalc |
|
录音机 |
SoundRec |
|
音量控制 |
Volume Control |
|
NetMeeting |
MPWClass |
|
MSN Messenger |
MSNMSBLClass |
|
Windows Media Player |
WMPlayerApp |
|
MS-DOS |
ConsoleWindowClass |
程序窗口的标题名很容易获取,一般就在程序窗口的左上角,如图8.47所示。对于标题名不显示在窗口界面上的程序,可以在任务栏中查看其窗口标题。
图8.47 程序窗口标题
2. ActiveM!.u32
ActiveM!.u32中用于关闭外部程序的函数有M_CloseApp(className, winTitle)和M_ShutApp(className, winTitle),参数className为目标程序窗口的类名,winTitle为程序窗口的标题名。对于MDI(多文档界面)程序,需要指明主窗口的className和winTitle。这两个函数的区别为:函数M_CloseApp()是尝试关闭某个程序,关闭前将会提醒用户保存文件;函数M_ShutApp()为强制性关闭某个程序,不出现保存提示。例如:
M_CloseApp("Notepad", "demo.txt - 记事本")
M_ShutApp("APWMainClass", "test")
3. Budapi.u32
Budapi.u32中用于关闭程序的函数有baCloseWindow(WinHandle)和baCloseApp(WinHandle),参数WinHandle为目标程序窗口的句柄。关闭某个程序之前,首先需要使用函数baFindWindow (Class, Title)获取该程序窗口的句柄,参数Class为程序窗口的类名,Title为程序窗口的标题。例如:
Handle := baFindWindow("APWMainClass","test")
baCloseWindow(Handle)
技巧:可以用类观察器ClassView获取程序窗口的类名。
试一试:读者可以试一试在Authorware中调用Word打开一个Doc文档,然后分别用以上三种方法将目标Word窗口关闭。
专家说明
每种程序都有自己的类名,而每一个程序窗口又有自己唯一的句柄,例如即使打开了好几个文本文档,他们窗口的类名是一样的,但窗口句柄却不是一样的,一个句柄对应一个程序窗口。对于多文档界面(MDI)程序,需要指定主窗口的类名和标题名。
专家指点
并不是只有通过Authorware调用的程序窗口才能在Authorware中将其关闭,只要知道了目标程序的类名和窗口标题名,就可以获取窗口对应的句柄,然后将其关闭。同时,获取目标窗口的句柄后,不仅仅可以进行关闭操作,还可以进行窗口拉前、置顶、闪动、最大化、最小化等一系列操作。