none
關於取得通話記錄的問題 RRS feed

  • 問題

  • 各位先進大家好
    小弟不才 想請問要如何取得 WM6 上的通話紀錄
    有在 MSDN 上尋找過具體知道要用 API 的方式
    加入 PHONE.DLL 但卻一直不得其門而入
    希望各位先進能幫小弟做個範例解答一下

    環境如下:
    VS2008+VB.NET CF+WM6
    2009年3月21日 下午 04:29

解答

  • Hi,
    基本上我是參考code project這篇去修改的

    Retrieving and Storing Call History
    http://www.codeproject.com/KB/mobile/wm_callhistory.aspx?display=Print

    你下載下來裡面會有一個WindowsMibile6的類別(C#),相關程式碼都在裡面,你可以參考一下,裡面比較完整,下面這邊是我測試的程式碼

    Module
    Imports System.Runtime.InteropServices
    
    Module Module2
        <DllImport("Phone.dll")> _
        Public Function PhoneOpenCallLog(ByRef ph As IntPtr) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneGetCallLogEntry(ByVal h As IntPtr, ByRef pentry As CALLLOGENTRY) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneCloseCallLog(ByVal h As IntPtr) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneSeekCallLog(ByVal hdb As IntPtr, ByVal seek As CALLLOGSEEK, ByVal iRecord As UInteger, _
                                         ByRef piRecord As UInteger) As IntPtr
        End Function
    
        <StructLayout(LayoutKind.Explicit, Size:=48)> _
        Structure CALLLOGENTRY
            <FieldOffset(0)> _
            Public cbSize As UInteger
            <FieldOffset(4)> _
            Public ftStartTime As Long
            <FieldOffset(12)> _
            Public ftEndTime As Long
            <FieldOffset(20)> _
            Public iom As enumIOM
            <FieldOffset(24)> _
            Public flags As fFlags
            <FieldOffset(28)> _
            Public cidt As CALLERIDTYPE
            <FieldOffset(32)> _
            Public pszNumber As IntPtr
            <FieldOffset(36)> _
            Public pszName As IntPtr
            <FieldOffset(40)> _
            Public pszNameType As IntPtr
            <FieldOffset(44)> _
            Public pszNote As IntPtr
        End Structure
    
        Public Enum CALLERIDTYPE
            UNAVAILABLE
            BLOCKED
            AVAILABLE
        End Enum
    
        Public Enum enumIOM
            MISSED
            INCOMING
            OUTGOING
        End Enum
    
        <Flags()> _
         Public Enum fFlags As Byte
            Outgoing = &H1
            Connected = &H2
            Ended = &H4
            Roam = &H8
        End Enum
    
        Public Enum CALLLOGSEEK
            CALLLOGSEEK_BEGINNING = 2
            CALLLOGSEEK_END = 4
        End Enum
                
    End Module
    
    使用範例
    Public Sub enumCallLog()
            Dim h As IntPtr
            Dim entry As CALLLOGENTRY
            Dim LastlogIndex As UInteger = 0
            Dim CurrentlogIndex As UInteger = 0
    
            entry = New CALLLOGENTRY()
            entry.cbSize = Marshal.SizeOf(entry.GetType)
    
            PhoneOpenCallLog(h)
            If PhoneSeekCallLog(h, CALLLOGSEEK.CALLLOGSEEK_END, 0, LastlogIndex) = 0 Then
                For i As Integer = 0 To LastlogIndex - 1
                    PhoneSeekCallLog(h, CALLLOGSEEK.CALLLOGSEEK_BEGINNING, i, CurrentlogIndex)
                    PhoneGetCallLogEntry(h, entry)
                    ListBox1.Items.Add(Marshal.PtrToStringUni(entry.pszName) & "," & _
                                       Marshal.PtrToStringUni(entry.pszNumber))
                    Application.DoEvents()
                Next
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年3月29日 下午 03:56
    版主

所有回覆

  • 可用 PhoneGetCallLogEntry API 來做
    可以 search 一下這個 keyword 應該就不少 example, 比如說下面這篇
     http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesvbcs/thread/bac147e6-26c2-42cb-8daf-074fd6083142/
    • 已提議為解答 JocoboNY 2009年3月29日 上午 06:05
    • 已標示為解答 bauannModerator 2009年3月29日 下午 04:01
    • 已取消標示為解答 LeonChen 2009年3月30日 上午 01:53
    • 已取消提議為解答 LeonChen 2009年3月30日 上午 01:53
    2009年3月22日 上午 05:58
  • 先感謝 ellen jocobs 的回覆
    我去研究過了 MSDN 上 PhoneGetCallLogEntry 的相關文章,大多為 C# 寫的轉換成 VB 後有很多地方有錯誤
    小弟才疏學淺無法處理相關轉換的問題,轉換後的程式碼我貼在下方希望顧位先進幫我看看是哪裡發生問題


    Public Partial Class Form1   
        Inherits Form       
          
        Public Sub New()      
            InitializeComponent()           
        End Sub         
          
        Private Sub btnCalllog_Click(ByVal sender As ObjectByVal e As EventArgs)           
            GetLastDialedNumber()          
        End Sub   
          
          
          
        Private Class WinApi          
            <DllImport("Phone.dll")> _   
            Public Shared Sub PhoneOpenCallLog(ByRef ph As IntPtr)   
            End Sub         
              
            <DllImport("Phone.dll")> _   
            Public Shared Sub PhoneGetCallLogEntry(ByVal h As IntPtr, ByVal pentry As CALLLOGENTRY)   
            End Sub   
        End Class   
          
          
        Public Shared Function GetLastDialedNumber() As String          
            Dim h As IntPtr   
            Dim entry As CALLLOGENTRY   
            WinApi.PhoneOpenCallLog(h)   
            entry = New CALLLOGENTRY()   
            WinApi.PhoneGetCallLogEntry(h, entry)   
            Return (Marshal.PtrToStringUni(entry.pszNumber))         
        End Function   
          
        Friend Class CALLLOGENTRY           
            ' internal fields   
            Friend cbSize As UInteger = CUInt(System.Runtime.InteropServices.Marshal.SizeOf(GetType(CALLLOGENTRY)))   
            Friend ftStartTime As Long   
            Friend ftEndTime As Long   
            Friend iom As IOM   
            Friend flags As Flags   
     
            ' the following BOOLs are bit packed in this byte   
            Friend cidt As CALLERIDTYPE   
            Friend pszNumber As IntPtr   
            Friend pszName As IntPtr   
            Friend pszNameType As IntPtr   
            Friend pszNote As IntPtr   
              
            '-----------------------------------------------------------------------------------------   
              
            Public Enum CALLERIDTYPE           
                UNAVAILABLE   
                BLOCKED   
                AVAILABLE   
            End Enum   
             
            Public Enum IOM   
                MISSED   
                INCOMING   
                OUTGOING   
            End Enum          
                      
            'TODO: move into internal class if this works!   
             
            <Flags()> _   
            Public Enum Flags As Byte               
                Outgoing = &H1   
                Connected = &H2   
                Ended = &H4   
                Roam = &H8   
            End Enum          
             
            Public Sub New()   
            End Sub   
        End Class   
          
             
          
        Public Class CallLogEntry   
            Friend callLogEntry As CALLLOGENTRY   
            Public Enum CallerIDType   
                Unavailable   
                Blocked   
                Available   
            End Enum   
                  
            Public Enum CallType   
                Missed   
                Incoming   
                Outgoing   
            End Enum   
              
            Friend Sub New(ByVal callLogEntry As CALLLOGENTRY)   
                Me.callLogEntry = callLogEntry   
            End Sub   
        End Class      
    End Class  
    2009年3月26日 上午 09:01
  •  PhoneGetCallLogEntry 第二個參數 如果是要傳回的,是不是應該用call by reference

    ps.因為我不會寫VB,所以只是用猜的

    • 已提議為解答 JocoboNY 2009年3月29日 上午 06:05
    2009年3月27日 上午 04:40
  • Hi,
    基本上我是參考code project這篇去修改的

    Retrieving and Storing Call History
    http://www.codeproject.com/KB/mobile/wm_callhistory.aspx?display=Print

    你下載下來裡面會有一個WindowsMibile6的類別(C#),相關程式碼都在裡面,你可以參考一下,裡面比較完整,下面這邊是我測試的程式碼

    Module
    Imports System.Runtime.InteropServices
    
    Module Module2
        <DllImport("Phone.dll")> _
        Public Function PhoneOpenCallLog(ByRef ph As IntPtr) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneGetCallLogEntry(ByVal h As IntPtr, ByRef pentry As CALLLOGENTRY) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneCloseCallLog(ByVal h As IntPtr) As IntPtr
        End Function
    
        <DllImport("Phone.dll")> _
        Public Function PhoneSeekCallLog(ByVal hdb As IntPtr, ByVal seek As CALLLOGSEEK, ByVal iRecord As UInteger, _
                                         ByRef piRecord As UInteger) As IntPtr
        End Function
    
        <StructLayout(LayoutKind.Explicit, Size:=48)> _
        Structure CALLLOGENTRY
            <FieldOffset(0)> _
            Public cbSize As UInteger
            <FieldOffset(4)> _
            Public ftStartTime As Long
            <FieldOffset(12)> _
            Public ftEndTime As Long
            <FieldOffset(20)> _
            Public iom As enumIOM
            <FieldOffset(24)> _
            Public flags As fFlags
            <FieldOffset(28)> _
            Public cidt As CALLERIDTYPE
            <FieldOffset(32)> _
            Public pszNumber As IntPtr
            <FieldOffset(36)> _
            Public pszName As IntPtr
            <FieldOffset(40)> _
            Public pszNameType As IntPtr
            <FieldOffset(44)> _
            Public pszNote As IntPtr
        End Structure
    
        Public Enum CALLERIDTYPE
            UNAVAILABLE
            BLOCKED
            AVAILABLE
        End Enum
    
        Public Enum enumIOM
            MISSED
            INCOMING
            OUTGOING
        End Enum
    
        <Flags()> _
         Public Enum fFlags As Byte
            Outgoing = &H1
            Connected = &H2
            Ended = &H4
            Roam = &H8
        End Enum
    
        Public Enum CALLLOGSEEK
            CALLLOGSEEK_BEGINNING = 2
            CALLLOGSEEK_END = 4
        End Enum
                
    End Module
    
    使用範例
    Public Sub enumCallLog()
            Dim h As IntPtr
            Dim entry As CALLLOGENTRY
            Dim LastlogIndex As UInteger = 0
            Dim CurrentlogIndex As UInteger = 0
    
            entry = New CALLLOGENTRY()
            entry.cbSize = Marshal.SizeOf(entry.GetType)
    
            PhoneOpenCallLog(h)
            If PhoneSeekCallLog(h, CALLLOGSEEK.CALLLOGSEEK_END, 0, LastlogIndex) = 0 Then
                For i As Integer = 0 To LastlogIndex - 1
                    PhoneSeekCallLog(h, CALLLOGSEEK.CALLLOGSEEK_BEGINNING, i, CurrentlogIndex)
                    PhoneGetCallLogEntry(h, entry)
                    ListBox1.Items.Add(Marshal.PtrToStringUni(entry.pszName) & "," & _
                                       Marshal.PtrToStringUni(entry.pszNumber))
                    Application.DoEvents()
                Next
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年3月29日 下午 03:56
    版主
  • 感謝 bauann 兄
    MVP 真的是當之無愧 吼賽雷呀!!
    最近再研究無線裝置 (PHONE WIFI BT ....) 的設置
    不知 bauann 兄右甚麼好建議
    2009年4月17日 下午 02:23
  • Hi Leon

    您太客氣了...orz
    WIFI、BT等等的這些比較沒有研究耶,你指的是那個部分呢?我看 -KYLIN- 以及 ellen jocobs 兩位大大常有發表一些教學/心得,其中也有你提到的部分,或許可以參考看看 ~
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年4月20日 上午 01:38
    版主