• <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 閱讀(2762) 評論(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
            久久人人爽人人爽人人AV| 国产精品免费久久| 狠狠综合久久AV一区二区三区| 亚洲人成网站999久久久综合| 久久精品国产亚洲αv忘忧草 | 韩国三级大全久久网站| 2021久久国自产拍精品| 久久se精品一区精品二区国产| 久久久久亚洲AV成人网人人网站 | 久久亚洲国产成人影院| 久久久久亚洲AV无码专区首JN| 久久国产精品99久久久久久老狼 | 热久久这里只有精品| 合区精品久久久中文字幕一区 | 久久久久亚洲AV成人片| 蜜臀久久99精品久久久久久| 国产成人久久精品区一区二区| 日韩va亚洲va欧美va久久| 精品久久香蕉国产线看观看亚洲| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 韩国三级中文字幕hd久久精品| 香蕉久久夜色精品升级完成| 国产99久久久久久免费看| 99久久无码一区人妻a黑| 久久人人爽人人爽人人片AV不| 成人国内精品久久久久影院VR| 99久久国产热无码精品免费| 99久久国产精品免费一区二区| 久久人人爽人人精品视频| 狠狠精品久久久无码中文字幕| 久久精品这里热有精品| 久久夜色精品国产噜噜亚洲AV| 久久天天婷婷五月俺也去| 久久97久久97精品免视看| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 狠狠色丁香久久婷婷综| 国产一区二区精品久久| 久久精品国产半推半就| 久久久精品午夜免费不卡| 99久久精品国内| 久久99国产精品久久99|