【經典】WinCE下系統托盤程序之聲音控制篇

程序在以下平臺測試通過:

操作系統:Wince6.0

軟件平臺:EVC4.0

硬件平臺:深圳友堅恆天科技有限公司ARM11開發板UT-S3C6410

             http://www.urbetter.com

 

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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章