1.如何判断是否在authoring环境下.
STDMETHODIMP_(MoaError) MoaCreate_TStdXtra (TStdXtra FAR * This)
{
This->pCallback->QueryInterface(&IID_IMoaAppInfo,(PPMoaVoid) &This->pAppInterface));//获得IMoaAppInfo接口
This->pAppInterface->GetInfo(kMoaAppInfo_RunMode,This->XtraInfo.AppType,32);//获得运行模式,如果AppType为"Projector",则为发布模式,"Author"则为编著模式.XtraInfo是我自己定义的结构,存放初始化检测的各种信息
This->pAppInterface->GetInfo(kMoaAppInfo_ProductName, This->XtraInfo.AppName, 32);//检测软件类型,"Director"就是Director了,"Authorware"说明是运行在Authorware下.
//还可以进行用户名,版本的检测,请参考XDK说明
...
}
2.如何获取StageWindow和播放器窗口句柄.
This->pCallback->QueryInterface(&IID_IMoaMmWndWin,(PPMoaVoid) &This->pWindowInterface);//获取Windows平台下的窗口操作接口.注意这里及上面的例子中我已将这些接口声明在Xtra头文件的EXTERN_BEGIN_DEFINE_CLASS_INSTANCE_VARS(TStdXtra)宏中了.
This->pWindowInterface->WinGetParent((MoaMmHInst*)&This->XtraInfo.InstanceHandle,(MoaMmHWnd*)&This->XtraInfo.WindowHandle);//获取主程序EXE的实例句柄和窗口句柄.在编著环境下就是Director的实例句柄和窗口句柄,在Projector模式下就是Projector的实例和窗口句柄(不是Dll的句柄,在编著环境下窗口句柄不是StageWindow的句柄).该调用不可放在
STDMETHODIMP_(MoaError) MoaCreate_TStdXtra (TStdXtra FAR * This)
中检测,原因是Projector模式下xtra载入时窗口还未建立,这时是检测不到窗口的(Authorware则不同,先建立窗口再载入xtra).所以最好随用随检测.
要在编著环境下获取StageWindow句柄,还要继续遍历子窗口,找窗口类为ASISubWndClass的窗口(Director客户区窗口)下面的窗口类为ImlWinCls的子窗口,这就是StageWindow了.
3.如何获取DLL的实例句柄
Xtra也是Dll,如果你要在其中用到资源或者要安装个局部钩子什么的,必须知道它,XDK将DllMain隐藏在头文件中,这在里将句柄赋给了全局变量gXtraFileRef,在要用到的文件中用extern HINSTANCE gXtraFileRef;声明一下就能用了.
4. 关于播放器窗口
在Projector模式下,看起来只有一个窗口,实际上有两个,StageWindow是一个,还有一个看不见,原因是坐标为很大的负值,在屏幕外面.这个窗口是StageWindow的Owner窗口,任务栏上的按钮就是它生成的,而不是StageWindow,这也是为什么Gray Smith的BuddyTray隐藏窗口后任务栏按钮不消失的原因.这让我想起了Delphi和C++Builder,主Form的Handle指向的不是真正的主窗口,真正的主窗口是Application->Handle指向的窗口,也是看不见的.不知道是谁偷谁的.;)
|