初级视频编辑室|草蜢非编论坛|初级视编室|草蜢视频编辑|会声会影|威力导演|电子相册

标题: Xtra 开发技巧心得 [打印本页]

作者: 五星上将    时间: 2014-11-24 21:36
标题: Xtra 开发技巧心得
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指向的窗口,也是看不见的.不知道是谁偷谁的.;)

作者: gxj000    时间: 2014-11-24 22:00
谢谢楼主提供分享!!
作者: yipingzi    时间: 2015-1-21 11:49
阳春白雪,逛一逛,看一看,顶一顶。




欢迎光临 初级视频编辑室|草蜢非编论坛|初级视编室|草蜢视频编辑|会声会影|威力导演|电子相册 (http://shibianshi.com/) Powered by Discuz! X3.2