• <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
            91精品国产高清91久久久久久| 久久成人国产精品| 久久久久免费视频| 久久这里有精品| 久久久久亚洲精品无码蜜桃| 久久婷婷五月综合97色| 成人亚洲欧美久久久久| 亚洲国产成人久久一区WWW| 国内精品伊人久久久久AV影院| 欧美久久亚洲精品| 国内精品久久人妻互换| 久久九九久精品国产免费直播| 久久精品日日躁夜夜躁欧美| 国产成人精品久久| 99精品国产99久久久久久97| 无码任你躁久久久久久老妇App| 久久精品国产亚洲AV不卡| 狼狼综合久久久久综合网| 久久久91人妻无码精品蜜桃HD | 99精品久久精品一区二区| 99久久99久久精品国产片| 精品久久一区二区三区| 久久99精品久久久久婷婷| 亚洲欧洲中文日韩久久AV乱码| 久久精品成人免费看| 色婷婷综合久久久久中文一区二区| 91精品国产91热久久久久福利| 色婷婷综合久久久久中文 | 国产精品久久久久久福利69堂| 亚洲国产成人精品女人久久久| 久久久久国产精品| 久久精品国产国产精品四凭| 精品久久久久久久| 日本精品久久久中文字幕| 久久精品亚洲日本波多野结衣| 久久综合噜噜激激的五月天| 久久亚洲熟女cc98cm| 狠狠综合久久AV一区二区三区| 久久久亚洲裙底偷窥综合 | 久久婷婷五月综合97色| 精品久久久久中文字幕日本|