• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            Windows Mobile中如何更改來電鈴聲

            來電鈴聲的設置在注冊表中的HKEY_CURRENT_USER\\ControlPanel\\Sounds\\RingTone0\\Script下的值,就是所要播放的鈴聲文件。查看Windows Mobile下的注冊表,用VS2005中Visual Studio Remote Tools->Remote Registry Editor工具就可以,不須其他的軟件。
            我們可以在電話來了后根據號碼播放不同的鈴聲,然后在通話結束再將鈴聲恢復。下面是通過MAPI來實現
            1.判斷來電號碼
            VOID CALLBACK LineCallback(DWORD hDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
            {
             switch(dwMsg)
                {
                case LINE_CALLINFO://1L呼叫信息
              {
               switch(dwParam1)
               {
               case LINECALLINFOSTATE_CALLERID://0x00008000
                {
                 LINECALLINFO *lpCallInfo;
                 lpCallInfo = (LINECALLINFO *)malloc(sizeof(LINECALLINFO)+1000);
                 memset(lpCallInfo, 0, sizeof(LINECALLINFO)+1000);
                 lpCallInfo->dwTotalSize = sizeof(LINECALLINFO)+1000;
                 while (1)
                 {
                  lineGetCallInfo( (HCALL)hDevice, lpCallInfo);
                  if (lpCallInfo->dwTotalSize < lpCallInfo->dwNeededSize)
                   lpCallInfo = (LINECALLINFO *)realloc(lpCallInfo,lpCallInfo->dwNeededSize);
                  else
                   break;
                 }
                 
                 lstrcpy(szPhoneNumber,(LPTSTR)((LPSTR)((DWORD)lpCallInfo+(DWORD)lpCallInfo->dwCallerIDOffset)));
                 free(lpCallInfo);
                 // szPhoneNumber  ---- 呼入的電話號碼
                 //char strPhoneNumber[30 + 1] = {0};
               //在這里根據號碼來設置鈴聲
               
                             
            }
              break;
             case LINE_LINEDEVSTATE:
              break;
             case LINE_APPNEWCALL:  //有呼叫進來23L
              break;
             case LINE_REPLY:
              break;
             case LINE_CALLSTATE:  //呼叫狀態2
              {
              case LINECALLSTATE_DISCONNECTED://掛機
               {
                     RedoReg();
               }
               break;
              }
              break;
             }
            }
            DWORD InitializeTAPI(void)
            {
             ReadReg();//讀系統中默認的鈴聲設置
                 //在啟動中加入初始化
             if ( lineInitialize( &LineApp, g_hInst, (LINECALLBACK)LineCallback, g_szAppWndClass, &LineHandleCount) == 0)
             {
              LineHandles = new HLINE[LineHandleCount];
              for(DWORD i = 0; i < LineHandleCount; i++)
              {
               int rc;
               DWORD ver;
               LINEEXTENSIONID extensionID;
               
               if ( lineNegotiateAPIVersion( LineApp, i, 0x00010003, 0x00020000, &ver, &extensionID) == 0)
               {
                rc = lineOpen( LineApp,
                 i,
                 &LineHandles[i],
                 ver,
                 0,
                 (DWORD)0,
                 LINECALLPRIVILEGE_MONITOR|LINECALLPRIVILEGE_OWNER,
                 LINEMEDIAMODE_INTERACTIVEVOICE,
                 NULL);
                        }
                    }
             }
             
             return 0;
            }
            2,讀取并保存系統鈴聲
            void ReadReg(void)
            {
             HKEY hKey = NULL;
                HKEY hSubKey = NULL;
             LRESULT SS;
             SS = RegOpenKeyEx(HKEY_CURRENT_USER ,L"\\ControlPanel\\Sounds\\RingTone0", 0,0,&hKey);
             if(ERROR_SUCCESS != SS)//打開注冊表失敗
              RegCloseKey (hKey);


             DWORD    lpType = 1; 
             DWORD   lpcbData = 80;
             SS = RegQueryValueEx(hKey ,L"Script", (LPDWORD)NULL,NULL,(BYTE*)lpData,&lpcbData);
             DWORD Result = GetLastError();
             if(ERROR_SUCCESS != SS)//讀鍵值失敗
              RegCloseKey (hKey);
            }
            3,更改鈴聲設置
            void WriteReg(void)
            {
             LRESULT lr;
             HRESULT hr = E_FAIL;
             HKEY hKey = NULL;
             DWORD dwDisposition;
             TCHAR wszValue[60] = L"a";
             
             lr = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("\\ControlPanel\\Sounds\\RingTone0"),
              0, NULL, 0, 0, NULL,
              &hKey, &dwDisposition);
             if (lr != ERROR_SUCCESS)
              RegCloseKey(hKey);
             
             lr = RegSetValueEx(hKey, L"Script", 0, REG_SZ, (LPBYTE) wszValue, (lstrlen(wszValue) + 1) * sizeof(TCHAR));
             if (lr != ERROR_SUCCESS)
              RegCloseKey(hKey);
             
             RegCloseKey(hKey);
             hKey = NULL;
            }

            4.通話結束,釋放資源并恢復系統鈴聲
            void ReleaseLine(void)
            {
             RedoReg();

             for ( DWORD i=0; i<LineHandleCount; i++ )
             {
              lineClose( LineHandles[ i ] );
             }
            void ReadReg(void)
            {
             HKEY hKey = NULL;
                HKEY hSubKey = NULL;
             LRESULT SS;
             SS = RegOpenKeyEx(HKEY_CURRENT_USER ,L"\\ControlPanel\\Sounds\\RingTone0", 0,0,&hKey);
             if(ERROR_SUCCESS != SS)//打開注冊表失敗
              RegCloseKey (hKey);


             DWORD    lpType = 1; 
             DWORD   lpcbData = 80;
             SS = RegQueryValueEx(hKey ,L"Script", (LPDWORD)NULL,NULL,(BYTE*)lpData,&lpcbData);
             DWORD Result = GetLastError();
             if(ERROR_SUCCESS != SS)//讀鍵值失敗
              RegCloseKey (hKey);
            }
             delete[] LineHandles;
             lineShutdown( LineApp );

            }

            注意包含頭文件的順序,否則會出現很多編譯錯誤;在EVC上表現的比較明顯

            posted on 2009-02-22 21:12 Benjamin 閱讀(2758) 評論(7)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            評論

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            你好:你的根據來電號碼改變鈴聲的方案,我嘗試過了。有個問題,mobile手機會首先想起鈴聲,然后我們才能夠在LineCallback這個回調中捕獲來電號碼,這時作出處理已經晚了,不知有何方法能夠防止這種現象發生?
            2009-12-12 22:03 | tank

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            可以先不放鈴聲,待號碼出來后再放。自己放,用戶應答或是超時未應答,停止放音。也可以自己做來電顯示,把系統的屏蔽掉
            2009-12-13 17:35 | Benjamin

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            case LINE_CALLSTATE: //呼叫狀態2
            {
            case LINECALLSTATE_DISCONNECTED://掛機
            {
            RedoReg();
            }
            break;
            }
            break;


            ??????????????????????
            2010-05-13 09:56 | lindix

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            how can the code work??
            2010-05-13 09:57 | lindix

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            RedoReg()是自定義的函數,功能是恢復注冊表的初始設置,恢復到原來的鈴聲設置。
            2010-05-13 20:37 | Benjamin

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            @Benjamin
            先不放鈴聲,待號碼出來后再放,那時我們再修改音樂已經晚了,不能控制來電時的播放器,自己開一個播放器放不出聲音,怎么辦?
            2010-07-07 22:16 | 8yanghao

            # re: Windows Mobile中如何更改來電鈴聲  回復  更多評論   

            不是不放,是在電話剛進來的時候,首先修改鈴聲,待通話完畢再改回去,這樣播放的就是我們修改的鈴聲了
            2010-07-07 22:48 | Benjamin
            亚洲国产精品无码久久一区二区| 欧美久久综合性欧美| 久久综合久久伊人| 亚洲国产精品无码久久98| 久久er99热精品一区二区| 国产免费福利体检区久久| 久久婷婷是五月综合色狠狠| 久久精品国产亚洲av麻豆色欲 | 久久91精品国产91| 中文字幕人妻色偷偷久久 | 久久大香萑太香蕉av| 亚洲午夜久久久久久噜噜噜| 色综合久久久久| 色偷偷偷久久伊人大杳蕉| 久久久久成人精品无码 | av午夜福利一片免费看久久| 久久综合九色欧美综合狠狠 | 无码任你躁久久久久久| 国内精品伊人久久久久AV影院| 日批日出水久久亚洲精品tv| 国产一区二区三区久久精品| 久久无码AV一区二区三区| 亚洲天堂久久精品| 久久久久久毛片免费播放| 99精品国产免费久久久久久下载 | 中文成人无码精品久久久不卡| 久久婷婷国产麻豆91天堂| 色8久久人人97超碰香蕉987| 亚洲国产成人久久综合碰| 97久久精品人人澡人人爽| 久久综合久久自在自线精品自| 色综合久久中文字幕综合网| 国产精品免费久久久久久久久| 国产精品久久一区二区三区| 国产精品国色综合久久| av午夜福利一片免费看久久| 色综合久久综合中文综合网| 婷婷久久久亚洲欧洲日产国码AV| 久久精品国产亚洲αv忘忧草| 久久无码国产专区精品| 欧美伊人久久大香线蕉综合|