当前位置:编程学习 > C#/ASP.NET >>

C#语音编程有一步过不去,求帮助!

        private void tool_Voice_Click(object sender, EventArgs e)
        {

            //先初始化语音模块,启动监听方法,再启动语音采集方法
            if (tool_Voice.Text == "语音")
            {
                tool_Voice.Text = "关闭";

                try
                {
                   netchat1.Intptr = this.Handle;
                   netchat1.InitVoice();
                }
                catch
                {
                    MessageBox.Show("声音模块初始化失败");
                }
                try
                {
                    netchat1.Listen();
                }
                catch
                {
                    MessageBox.Show("监听模块异常");
                }
                try
                {
                    netchat1.StartSendVoice();
                }
                catch
                {
                    if (MessageBox.Show("应用程序出现问题,需要重新启动应该程序嘛?", "系统提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        Application.Exit();//先关闭应用程序
                        System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
                    }

                }
            }
            else
            {
                netchat1.Stop();
                tool_Voice.Text = "语音";

            }
        }

其中运行时                try
                {
                   netchat1.Intptr = this.Handle;
                   netchat1.InitVoice();
                }
                catch
                {
                    MessageBox.Show("声音模块初始化失败");
                }
一直显示“声音模块初始化失败”,后面“监听模块异常”什么的不会显示,就是说能正常运行,大家谁帮忙解释一下问题在哪,this.handle是什么意思,我在上面有viodeo = new cVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height);之类的,因为语音是参考别人代码改的,不知道为什么会有问题 --------------------编程问答-------------------- 就是自己的句柄,其他模块可以根据句柄和你通信,比如发消息 --------------------编程问答-------------------- netchat1.Intptr = this.Handle;
这句错了吧。this是什么
--------------------编程问答--------------------
引用 2 楼 wawd74520 的回复:
netchat1.Intptr = this.Handle;
这句错了吧。this是什么

我是参考下面的代码,this指的应该是当前窗体这个类
 private void btnChat_Click(object sender, EventArgs e)
        {//先初始化语音模块,启动监听方法,再启动语音采集方法
            if (btnChat.Text == "开始语聊")
            {
                btnChat.Text = "停止语聊";
                btnSelect.Enabled = false;
                btnSubmit.Enabled = false;
                try
                {
                    netchat1.Intptr = this.Handle;
                    netchat1.InitVoice();
                }
                catch
                {
                    FormWrite("声音模块初始化失败");
                }
                try
                {
                    netchat1.Listen();
                }
                catch
                {
                    FormWrite("监听模块异常");
                }
                try
                {
                    netchat1.StartSendVoice();
                }
                catch
                {
                    if (MessageBox.Show("应用程序出现问题,需要重新启动应该程序嘛?", "系统提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        Application.Exit();//先关闭应用程序
                        System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
                    }

                }
            }
            else
            {
                netchat1.Stop();
                btnChat.Text = "开始语聊";
                btnSelect.Enabled = true;
                btnSubmit.Enabled = true;
            }
        }
--------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
就是自己的句柄,其他模块可以根据句柄和你通信,比如发消息
哦,我想知道声音模块初始化失败问题在哪里啊 --------------------编程问答--------------------
这两张图一张是参考代码的运行,一个是我的 --------------------编程问答-------------------- 从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗? 

然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么? 

Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点: 

暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的; 
操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办? 
所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。 

在Windows系统中,这个编号就叫做"句柄"。 

 

Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。 

1、先来谈谈Handle 

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。 

简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。 

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。 

2、进程ID 

首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。 

深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。 

3、HINSTANCE 

HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。

--------------------编程问答-------------------- 顶一顶 --------------------编程问答--------------------
引用 3 楼 qsmys 的回复:
引用 2 楼 wawd74520 的回复:netchat1.Intptr = this.Handle;
这句错了吧。this是什么
我是参考下面的代码,this指的应该是当前窗体这个类
C# code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546……

我的意思是你不应该把当前窗体句柄给netchat1.Intptr 
去找找这个的用法吧
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,