程序在以下平臺測試通過: 操作系統:Wince6.0 軟件平臺:EVC4.0 硬件平臺:深圳友堅恆天科技有限公司ARM11開發板UT-S3C6410
在XP下我們能經常看到系統托盤的圖標,也就是右下角的小圖標,比如:QQ圖標、音量控制圖標等,那麼Wince下的如何實現系統托盤呢?本文通過圖解+代碼的方式詳細介紹系統托盤程序實現的整個步驟。
先來看看程序實現後的效果圖:
1、 開機自動運行系統托盤程序 2、 左鍵單擊圖標(小喇叭),上下拖動調整音量大小
3、 點擊“Mute“靜音
4、 雙擊打開系統音量控制界面
步驟: 1、 EVC下建立一個WCE Application Project 點擊ok 2、 選擇A Sample Windows CE Application 點擊“Finish” 3、 創建並編輯對話框資源
4、 插入兩個托盤ICON 一個是正常狀態,一個是靜音狀態
程序很簡單,主要包括幾個方面: 1、 自定義一個消息用來處理系統托盤的操作 2、 初始化NOTIFYICONDATA結構 3、 調用API函數Shell_NotifyIcon 4、 系統托盤消息處理
5、 將編譯生成的SoundSystemTray.exe拷貝至Wince 工程目錄下 6、 將在SoundSystemTray.exe 加到NK中 platform.bib中添加 SoundSystemTray.exe $(_FLATRELEASEDIR)/SoundSystemTray.exe NK S 7、 設置開機自動運行SoundSystemTray.exe platform.reg中添加 [HKEY_LOCAL_MACHINE/Init] "Launch80"="SoundSystemTray.exe" "Depend80"=hex:1e,00
下面貼出所有代碼: // VIA_Volume.cpp : Defines the entry point for the application. //
#i nclude "stdafx.h" #i nclude "resource.h" #i nclude
#define VOLUME_DEBUG 1
#define WM_SHELL_NOTIFYICON (WM_USER +11) //自定義消息
BOOL CALLBACK DlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT OnShowIcon(HWND hwnd,WPARAM wParam,LPARAM lParam);
DWORD CurrentVolume; BOOL bIsMute; NOTIFYICONDATA nid;
HICON hIcon; HICON hIcon1;
//////////////////////////////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; InitCommonControls();
HWND hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_VOLUME),NULL,DlgProc); if (!hwnd) { RETAILMSG(VOLUME_DEBUG,(TEXT("CreateDialog fail !/r/n"))); return FALSE; }
waveOutGetVolume(0,&CurrentVolume);//得到當前系統消息值
SendMessage(GetDlgItem(hwnd,IDC_SLIDER1), TBM_SETPOS, (WPARAM)TRUE, (0xFFFF-CurrentVolume)); //加載ICON及靜音ICON hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON_ON)); hIcon1 = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON_OFF)); //初始化NOTIFYICONDATA結構 nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; wcscpy(nid.szTip,TEXT("volume")); nid.uID = IDI_ICON_ON; nid.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON; nid.uCallbackMessage = WM_SHELL_NOTIFYICON; nid.hIcon = hIcon; // 調用API Shell_ NotifyIcon加載系統托盤圖標 Shell_NotifyIcon(NIM_ADD,&nid);
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
while(GetMessage(&msg,NULL,0,0)) { if (!IsDialogMessage(hwnd,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
return msg.wParam;
}
BOOL CALLBACK DlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { DWORD x,y; switch (uMsg) { case WM_INITDIALOG://窗口初始化 { RETAILMSG(VOLUME_DEBUG,(TEXT("OnInitDialog !/r/n"))); SendMessage(GetDlgItem(hwnd,IDC_CHECK1),BM_SETCHECK,BST_UNCHECKED,0); SendMessage(GetDlgItem(hwnd,IDC_SLIDER1), TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0x0);//設置最小音量值 SendMessage(GetDlgItem(hwnd,IDC_SLIDER1), TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)0xffff); //設置最大音量值 x = SendMessage(GetDlgItem(hwnd,IDC_SLIDER1), TBM_GETRANGEMAX, 0, 0); y = SendMessage(GetDlgItem(hwnd,IDC_SLIDER1), TBM_GETRANGEMIN, 0, 0); RETAILMSG(VOLUME_DEBUG,(TEXT("set volume rang :0x%x--0x%x/r/n"),y,x)); } break; case WM_COMMAND: { if(SendMessage(GetDlgItem(hwnd,IDC_CHECK1),BM_GETCHECK,0,0) == BST_CHECKED) //靜音 { bIsMute = TRUE; waveOutSetVolume(0,0); RETAILMSG(VOLUME_DEBUG,(TEXT("Mute,CurrentVolume =0x%x/r/n"),CurrentVolume)); //PostQuitMessage(0); nid.hIcon = hIcon1; Shell_NotifyIcon(NIM_MODIFY,&nid); } else { bIsMute = FALSE; waveOutSetVolume(0,CurrentVolume); RETAILMSG(VOLUME_DEBUG,(TEXT("unMute:CurrentVolume:0x%x/r/n"),CurrentVolume)); //PostQuitMessage(0); nid.hIcon = hIcon; Shell_NotifyIcon(NIM_MODIFY,&nid); } } break; case WM_SHELL_NOTIFYICON: //處理系統托盤消息 { OnShowIcon(hwnd,wParam,lParam); } break; case WM_ACTIVATE://點擊不在窗口時的處理 { RETAILMSG(VOLUME_DEBUG,(TEXT("WM_ACTIVATE !/r/n"))); if (wParam == WA_INACTIVE) { RETAILMSG(VOLUME_DEBUG,(TEXT("WA_INACTIVE !/r/n"))); ShowWindow(hwnd,SW_HIDE); } } break; case WM_VSCROLL://音量控制處理 {
CurrentVolume = SendMessage(GetDlgItem(hwnd,IDC_SLIDER1),TBM_GETPOS,(WPARAM)TRUE,0); CurrentVolume = 0xFFFF-CurrentVolume;
if (bIsMute) { //waveOutSetVolume(0,0); RETAILMSG(VOLUME_DEBUG,(TEXT("Mute:CurrentVolume:0x%x/r/n"),CurrentVolume)); break; } else { waveOutSetVolume(0,CurrentVolume); RETAILMSG(VOLUME_DEBUG,(TEXT("waveOutSetVolume CurrentVolume=0x%x/r/n"),CurrentVolume)); } } break; default: break;
}
return 0; }
LRESULT OnShowIcon(HWND hwnd,WPARAM wParam,LPARAM lParam) { if (wParam!=IDI_ICON_ON && wParam!=IDI_ICON_OFF) { RETAILMSG(VOLUME_DEBUG,(TEXT(" icon err...wParam =%d /r/n"),wParam)); return FALSE; } switch (lParam) { case WM_LBUTTONDBLCLK: //雙擊,打開系統音量控制程序 { PROCESS_INFORMATION pi; CreateProcess(_T("//Windows//ctlpnl.exe"), _T("//Windows//cplmain.cpl,10"), NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi); } break; case WM_LBUTTONUP: //單擊,打開音量控制窗口 { POINT pt; GetCursorPos(&pt); ShowWindow(hwnd,SW_SHOW); SetForegroundWindow(hwnd); MoveWindow(hwnd,pt.x,324,58,128,TRUE);//設置窗口顯示位置 } break; default: break; } return 0; } |
【經典】WinCE下系統托盤程序之聲音控制篇
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.