詳解WINCE的控制面板
//========================================================================
//TITLE:
// 詳解WINCE的控制面板
//AUTHOR:
// norains
//DATE:
// Tuesday 29-August-2006
//========================================================================
曾經(jīng)在我的一篇《控制面板的創(chuàng )建》中介紹過(guò)WinCE控制面板的結構,不過(guò)由于那篇文章其目的只在于控制面板如何調用EXE程序,故對控制面板也僅是泛泛而談.不過(guò)在這篇文章中,我們將對WinCE的使用方法來(lái)個(gè)整體的詳解.
1.控制面板的結構
控制面板其實(shí)也是個(gè)動(dòng)態(tài)鏈接庫,區別只在于后綴名為.cpl,以及對外接口為CPlApplet().
接口的原型為:
LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
在接口函數中我們需要實(shí)現特定幾個(gè)消息的響應,控制面板才能正常運作.為方便觀(guān)察,在這里直接貼出消息的響應結構:
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// The entry point to the Control Panel application.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
extern "C" LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
{
switch (message)
{
case CPL_INIT:
// Perform global initializations, especially memory
// allocations, here.
// Return 1 for success or 0 for failure.
// Control Panel does not load if failure is returned.
return 1;
case CPL_GETCOUNT:
// The number of actions supported by this Control
// Panel application.
return 1;
case CPL_NEWINQUIRE:
{
// This message is sent once for each dialog box, as
// determined by the value returned from CPL_GETCOUNT.
// lParam1 is the 0-based index of the dialog box.
// lParam2 is a pointer to the NEWCPLINFO structure.
return 0; //means CPLApplet succeed
return 1; // Nonzero value means CPlApplet failed.
}
case CPL_DBLCLK:
{
// The user has double-clicked the icon for the
// dialog box in lParam1 (zero-based).
return 0; // CPlApplet succeed.
return 1; // CPlApplet failed.
}
case CPL_STOP:
// Called once for each dialog box. Used for cleanup.
case CPL_EXIT:
// Called only once for the application. Used for cleanup.
default:
return 0;
}
return 1; // CPlApplet failed.
} // CPlApplet
這幾個(gè)消息的作用分別是:
CPL_INIT:初始化,可以在這分配內存等等.
CPL_GETCOUNT:返回控制面板程序的個(gè)數.因為一個(gè).cpl文件中,可能包含多個(gè)Applets.
CPL_NEWINQUIRE:返回包含程序名和圖標信息的NEWCPLINFO結構
CPL_DBLCLK:雙擊時(shí)響應
CPL_STOP:單個(gè)組件退出時(shí)響應,用來(lái)清除資源內存等
CPL_EXIT:退出整個(gè)cpl程序時(shí)響應
這些消息的定義可以在cpl.h中找到
2.在explorer中使用
如果定制的系統中帶有explorer UI,只要把編譯好的文件放進(jìn)"windows",然后再打開(kāi)"控制面板"就可以看到.
3.如何調用.cpl
就像PC機中.dll文件不能直接運行,需要借助rundll32.exe來(lái)運行一樣,WinCE下的.cpl也需要相應的程序來(lái)調用,這個(gè)程序就是:"ctlpnl.exe".
比如我們需要調用系統自帶的cplmain.cpl的"電源管理",只要在開(kāi)始菜單的運行中輸入:"ctlpnl.exe windowscplmain.cpl,5".在路徑后面緊跟的"5"只是因為"電源管理"在cplmain.cpl中輸入第五個(gè)Applet而已.
由此我們不難得出在程序中運用ShellExecuteEx()函數調用控制面板的Applet的方法.以下這段代碼,效果和在命令行中輸入命令一樣,也是調用"電源管理".
SHELLEXECUTEINFO info;
TCHAR szControlPanelCmdLine[ 200 ];
swprintf( szControlPanelCmdLine, L"\windows\cplmain.cpl,5");
info.cbSize = sizeof( info );
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.lpVerb = NULL;
info.lpFile = TEXT("ctlpnl.exe");
info.lpParameters = szControlPanelCmdLine;
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx( info );
如果想調用cplmain.cpl的其它Applet,只要把數字改為相對應的即可.
以下所列的第一項序號為0,接下的為1,其后的繼續遞增.
0 CPL_Comm
1 CPL_Dialing
2 CPL_Keyboard
3 CPL_Password
4 CPL_Owner
5 CPL_Power
6 CPL_System
7 CPL_Screen
8 CPL_Mouse
9 CPL_Stylus
10 CPL_Sounds
11 CPL_SIP"
12 CPL_Remove
13 CPL_DateTime
14 CPL_Certs
15 CPL_Accessib
4.系統自帶控制面板的代碼
微軟對控制面板的代碼是完全公開(kāi)的,如果安裝的是PB4.2,代碼可以在"PUBLICWCESHELLFEOAKCTLPNL"中找到.
CTLPNL文件夾中有九個(gè)文件夾,分別對應不同的CPL文件:
ADVBACKLIGHT:高級背光燈管理
BTHPNL:藍牙
CONNPNL:撥號網(wǎng)絡(luò )
CONTROL:主控制臺,我們在explorer中看到的"控制面板"應該就是這個(gè)
CPLMAIN:會(huì )生成cplmain.cpl,控制面板的大多數選項均源自于此
CTLPNL:和CONTROL相關(guān)聯(lián)的
DMPNL:沒(méi)使用過(guò),不太清楚.不過(guò)查看rc文件應該是設置上網(wǎng)的.
INTL2:區域和語(yǔ)言設置
STGUI:存儲器管理
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
//TITLE:
// 詳解WINCE的控制面板
//AUTHOR:
// norains
//DATE:
// Tuesday 29-August-2006
//========================================================================
曾經(jīng)在我的一篇《控制面板的創(chuàng )建》中介紹過(guò)WinCE控制面板的結構,不過(guò)由于那篇文章其目的只在于控制面板如何調用EXE程序,故對控制面板也僅是泛泛而談.不過(guò)在這篇文章中,我們將對WinCE的使用方法來(lái)個(gè)整體的詳解.
1.控制面板的結構
控制面板其實(shí)也是個(gè)動(dòng)態(tài)鏈接庫,區別只在于后綴名為.cpl,以及對外接口為CPlApplet().
接口的原型為:
LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
在接口函數中我們需要實(shí)現特定幾個(gè)消息的響應,控制面板才能正常運作.為方便觀(guān)察,在這里直接貼出消息的響應結構:
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// The entry point to the Control Panel application.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
extern "C" LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
{
switch (message)
{
case CPL_INIT:
// Perform global initializations, especially memory
// allocations, here.
// Return 1 for success or 0 for failure.
// Control Panel does not load if failure is returned.
return 1;
case CPL_GETCOUNT:
// The number of actions supported by this Control
// Panel application.
return 1;
case CPL_NEWINQUIRE:
{
// This message is sent once for each dialog box, as
// determined by the value returned from CPL_GETCOUNT.
// lParam1 is the 0-based index of the dialog box.
// lParam2 is a pointer to the NEWCPLINFO structure.
return 0; //means CPLApplet succeed
return 1; // Nonzero value means CPlApplet failed.
}
case CPL_DBLCLK:
{
// The user has double-clicked the icon for the
// dialog box in lParam1 (zero-based).
return 0; // CPlApplet succeed.
return 1; // CPlApplet failed.
}
case CPL_STOP:
// Called once for each dialog box. Used for cleanup.
case CPL_EXIT:
// Called only once for the application. Used for cleanup.
default:
return 0;
}
return 1; // CPlApplet failed.
} // CPlApplet
這幾個(gè)消息的作用分別是:
CPL_INIT:初始化,可以在這分配內存等等.
CPL_GETCOUNT:返回控制面板程序的個(gè)數.因為一個(gè).cpl文件中,可能包含多個(gè)Applets.
CPL_NEWINQUIRE:返回包含程序名和圖標信息的NEWCPLINFO結構
CPL_DBLCLK:雙擊時(shí)響應
CPL_STOP:單個(gè)組件退出時(shí)響應,用來(lái)清除資源內存等
CPL_EXIT:退出整個(gè)cpl程序時(shí)響應
這些消息的定義可以在cpl.h中找到
2.在explorer中使用
如果定制的系統中帶有explorer UI,只要把編譯好的文件放進(jìn)"windows",然后再打開(kāi)"控制面板"就可以看到.
3.如何調用.cpl
就像PC機中.dll文件不能直接運行,需要借助rundll32.exe來(lái)運行一樣,WinCE下的.cpl也需要相應的程序來(lái)調用,這個(gè)程序就是:"ctlpnl.exe".
比如我們需要調用系統自帶的cplmain.cpl的"電源管理",只要在開(kāi)始菜單的運行中輸入:"ctlpnl.exe windowscplmain.cpl,5".在路徑后面緊跟的"5"只是因為"電源管理"在cplmain.cpl中輸入第五個(gè)Applet而已.
由此我們不難得出在程序中運用ShellExecuteEx()函數調用控制面板的Applet的方法.以下這段代碼,效果和在命令行中輸入命令一樣,也是調用"電源管理".
SHELLEXECUTEINFO info;
TCHAR szControlPanelCmdLine[ 200 ];
swprintf( szControlPanelCmdLine, L"\windows\cplmain.cpl,5");
info.cbSize = sizeof( info );
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.lpVerb = NULL;
info.lpFile = TEXT("ctlpnl.exe");
info.lpParameters = szControlPanelCmdLine;
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx( info );
如果想調用cplmain.cpl的其它Applet,只要把數字改為相對應的即可.
以下所列的第一項序號為0,接下的為1,其后的繼續遞增.
0 CPL_Comm
1 CPL_Dialing
2 CPL_Keyboard
3 CPL_Password
4 CPL_Owner
5 CPL_Power
6 CPL_System
7 CPL_Screen
8 CPL_Mouse
9 CPL_Stylus
10 CPL_Sounds
11 CPL_SIP"
12 CPL_Remove
13 CPL_DateTime
14 CPL_Certs
15 CPL_Accessib
4.系統自帶控制面板的代碼
微軟對控制面板的代碼是完全公開(kāi)的,如果安裝的是PB4.2,代碼可以在"PUBLICWCESHELLFEOAKCTLPNL"中找到.
CTLPNL文件夾中有九個(gè)文件夾,分別對應不同的CPL文件:
ADVBACKLIGHT:高級背光燈管理
BTHPNL:藍牙
CONNPNL:撥號網(wǎng)絡(luò )
CONTROL:主控制臺,我們在explorer中看到的"控制面板"應該就是這個(gè)
CPLMAIN:會(huì )生成cplmain.cpl,控制面板的大多數選項均源自于此
CTLPNL:和CONTROL相關(guān)聯(lián)的
DMPNL:沒(méi)使用過(guò),不太清楚.不過(guò)查看rc文件應該是設置上網(wǎng)的.
INTL2:區域和語(yǔ)言設置
STGUI:存儲器管理
評論