用RIL做起来比较复杂,只想定制来电,所以找了一个phcanvas.h,按照网络上的说明搞了一个DLL挂接到系统下,原理有点和CeleDial一样,不过还没有把其他的功能返回给默认的DLL (等搞得差不多再搞吧)。 工作原理主要是就是通过定制PHExtGetPhoneViewInfo的PH_VIEW_INCOMING来创建自己的来电对话框。
HRESULT PHExtGetPhoneViewInfo(PH_VIEW view,
HINSTANCE* phInstance,
PH_VIEWINFOFLAGS* pvif,
LPPHONEVIEWHOOKPROC* plpfnHook,
LPCTSTR* plpTemplateName
)
{
switch (view)
{
// incoming call view
case PH_VIEW_INCOMING:
PrintInfoX("PHExtGetPhoneViewInfo PH_VIEW_INCOMING!");
switch(*pvif)
{
case PH_VIF_PORTRAIT:
// Specify a dialog template
*phInstance = g_MainWnd.m_hInst;
*pvif = (PH_VIEWINFOFLAGS) (*pvif | PH_VIF_ENABLEHOOK);
*plpfnHook = (LPPHONEVIEWHOOKPROC)CalertWndProc;
*plpTemplateName = MAKEINTRESOURCE(IDD_POCKETPC_PORTRAIT);
hr = S_OK;
break;
case PH_VIF_LANDSCAPE:
// Specify a calert landscape view dialog template
*phInstance = g_MainWnd.hInst;
*pvif = (PH_VIEWINFOFLAGS) (*pvif | PH_VIF_ENABLEHOOK);
*plpfnHook = (LPPHONEVIEWHOOKPROC)CalertWndProc;
*plpTemplateName = MAKEINTRESOURCE(IDD_POCKETPC_LANDSCAPE);
hr = S_OK;
break;
}
break;
挂接到 上后,来电时候,cprog会加载这个dll。我用了魔乐移动精灵来调试的,编译后可以用魔乐移动精灵杀cprog进程,然后就可以更新dll,完成后用WM的资源管理器启动cprog即可。
通过log发现cprog加载自定义来电dialog时候,会创建一个dialog,通过RemoteSpy看每次来电都在系统里面新建一个自定义的dialog。不知道是什么原因。改成系统的就是正常的。
搞不清楚是否和我自定义的对话框风格有关系。