0%

子佩录音盒二次开发(C#)

对子佩录音盒进行二次开发需要使用到其SDK中的两个DLL文件,qnviccub.dll,bridge.dll。在C#中导入DLL的API声明参考SDK中的BriSDKLib.cs。文件内容较长这里不再贴出。

子佩录音盒对于事件的监听是基于Win32的消息的。因此我们在接收程序中Windows消息的时候要判断消息类型(类型是一个UINT类型的无符号整数),而子佩录音盒的SDK里面也封装了一些消息类型的常量,我们只需要填写常量的名称即可。例如收到了来电的消息就是BriSDKLib.BriEvent_CallIn,得到了来电的电话号码就是BriSDKLib.BriEvent_GetCallID,等等。

C语言里面是在注册类的时候通过给WNDCLASSEX的lpfnWndProc属性绑定消息处理函数来监听消息从而做相应动作的。而我们在C#里面可以直接在WinForm代码里面重写DefWndProc方法来做消息处理,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case BriSDKLib.BRI_EVENT_MESSAGE: // 先判断是不是录音盒的消息
{
BriSDKLib.TBriEvent_Data EventData =
(BriSDKLib.TBriEvent_Data) Marshal.PtrToStructure(m.LParam, typeof(BriSDKLib.TBriEvent_Data));
string strValue = "";
switch (EventData.lEventType)
{
case BriSDKLib.BriEvent_CallIn: { ... break; } // 收到座机来电响铃的消息
case BriSDKLib.BriEvent_GetCallID: { ... break; } // 收到座机来电号码的消息
// 其他更多的消息类型
default: break;
}
if (strValue.Length > 0)
{
AppendStatus(strValue);
}
} break;
default: // 如果不是录音盒的消息则还按设计器里面添加的事件来处理
base.DefWndProc(ref m);
break;
}
}

一个简单demo,没有界面,只有一个托盘图标,托盘图标只有一个退出菜单项。如果座机接到来电时,就将来电的电话号码读取出来。这里只是做了一个弹出消息框显示电话号码。将来还可以扩展成将 来电的时间、收到来电的座机所插的接口和电话号码存入数据库。

把BriSDKLib.cs复制进项目,然后在WinForm添加一个菜单控件(父级菜单和一个退出菜单项)和一个系统托盘图标控件,添加Form的Load事件、FormClosed事件、Shown事件,添加退出菜单项的点击事件。然后编写代码。

运行前将进户线接到录音盒的LINE口,把座机的电话线接到录音盒的PHONE口,把录音盒的USB口通过随机提供的数据线接到电脑的USB接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GetPhoneNumber
{
public partial class Form1 : Form
{
public static string FromUnicodeByteArray(byte[] characters)
{
UnicodeEncoding u = new UnicodeEncoding();
string ustring = u.GetString(characters);
return ustring;
}

public static string FromASCIIByteArray(byte[] characters)
{
ASCIIEncoding encoding = new ASCIIEncoding();
string constructedString = encoding.GetString(characters);
return (constructedString);
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
if (BriSDKLib.QNV_OpenDevice(BriSDKLib.ODT_LBRIDGE, 0, "") <= 0 || BriSDKLib.QNV_DevInfo(0, BriSDKLib.QNV_DEVINFO_GETCHANNELS) <= 0)
{
// AppendStatus("打开设备失败");
MessageBox.Show("打开设备失败");
return;
}
for (Int16 i = 0; i < BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)
{
//在windowproc处理接收到的消息
BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, "", new StringBuilder(0), 0);
// selchannel.Items.Add(i+1);
}
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
BriSDKLib.QNV_CloseDevice(BriSDKLib.ODT_ALL, 0);
for (Int16 i = 0; i < BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)
{
//在windowproc处理接收到的消息
BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, "", new StringBuilder(0), 0);
// selchannel.Items.Add(i+1);
}
}

protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case BriSDKLib.BRI_EVENT_MESSAGE:
{
BriSDKLib.TBriEvent_Data EventData =
(BriSDKLib.TBriEvent_Data) Marshal.PtrToStructure(m.LParam, typeof(BriSDKLib.TBriEvent_Data));
string strValue = "";
switch (EventData.lEventType)
{
case BriSDKLib.BriEvent_GetCallID:
{
strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":接收到来电号码 " +
FromASCIIByteArray(EventData.szData);
MessageBox.Show(strValue);
this.Activate();

}
break;
default: break;
}
}
break;
default:
base.DefWndProc(ref m);
break;
}
}

private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
BriSDKLib.QNV_CloseDevice(BriSDKLib.ODT_ALL, 0);
for (Int16 i = 0; i < BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)
{
//在windowproc处理接收到的消息
BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, "", new StringBuilder(0), 0);
// selchannel.Items.Add(i+1);
}
Application.Exit();
}

private void Form1_Shown(object sender, EventArgs e)
{
Hide();
}
}
}
隐藏
推进创文常态化 共建文明襄阳城 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 做文明襄阳人 建文明襄阳城 凝聚文明正能量 筑梦千年古襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 创建全国文明城市 加快建设汉江流域中心城市 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 讲文明 树新风 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 用微笑融化陌生 用文明美化襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 争当文明使者 播撒文明新风