//最近要做个来电弹屏,在主窗体添加了弹屏监听事件,当有来电时就弹出来窗体,显示来电会员信息。就在这一步,用了线程来弹屏,在弹出窗口绑定会员信息,结果“线程间操作无效: 从不是创建控件的线程访问它”
        //后面研究了线程,用了一个线程及委托来搞定了,记录下来,,怕以后又遇到。
        /// <summary>
        /// 监听消息
        /// </summary>
        /// <param name="m"></param>   
        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_PhoneHook:
                                {
                                    strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":电话机摘机";
                                } break;
                            //电话机挂机
                            case BriSDKLib.BriEvent_PhoneHang:
                                {
                                    strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":电话机挂机";
                                    AddPhnoneLog(1);
                                } break;
                            //电话机来电响铃
                            case BriSDKLib.BriEvent_CallIn:
                                {
                                    两声响铃结束后开始呼叫转移到CC
                                    strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":来电响铃";
                                } break;
                            //接收到来电号码
                            case BriSDKLib.BriEvent_GetCallID:
                                {
                                    //strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":接收到来电号码 " + FromASCIIByteArray(EventData.szData);
                                    //接到来电,记录来电号码
                                    Str_Phone = FromASCIIByteArray(EventData.szData).Replace("\0","");

             //调用
                                    ShowPhone();
                                } break;
                            //停止呼入,产生未接号码
                            case BriSDKLib.BriEvent_StopCallIn:
                                {
                                   // strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":停止呼入,产生一个未接电话 ";
                                  
                                    //添加一条未接记录
                                    AddPhnoneLog(0);
                                   
                                } break;

case BriSDKLib.BriEvent_GetDTMFChar: strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":接收到按键 " + FromASCIIByteArray(EventData.szData); break;
                            case BriSDKLib.BriEvent_RemoteHang:
                                {
                                    strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":远程挂机 ";
                                } break;
                            case BriSDKLib.BriEvent_Busy:
                                {

strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":接收到忙音,线路已经断开 ";
                                } break;
                            case BriSDKLib.BriEvent_DialTone:
                                strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":检测到拨号音 ";
                                break;
                            case BriSDKLib.BriEvent_PhoneDial:
                                strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":电话机拨号 " + FromASCIIByteArray(EventData.szData);
                                break;
                            case BriSDKLib.BriEvent_RingBack:
                                strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":拨号后接收到回铃音 ";
                                break;
                            case BriSDKLib.BriEvent_DevErr:
                                {
                                    if (EventData.lResult == 3)
                                    {
                                        strValue = "通道" + (EventData.uChannelID + 1).ToString() + ":设备可能被移除 ";
                                    }
                                } break;
                            default: break;
                        }

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

/// <summary>
        /// 多线程显示来电会员信息
        /// </summary>
        private void ShowPhone()
        {
            Thread phoneThread = new Thread(new ThreadStart(ThreadShowPhone));
            phoneThread.IsBackground = true;
            phoneThread.Start();
        }

/// <summary>
        /// 通过线程延时显示,避免登录加载速度慢
        /// 通过委托将弹屏显示为主窗体的模式窗体(不用委托将不能实现模式窗体)
        /// </summary>
        private void ThreadShowPhone()
        {
            ShowPhoneInvoke spInvoke = new ShowPhoneInvoke(InvokeShowPhone);
            this.BeginInvoke(spInvoke);
        }

/// <summary>
        /// 显示窗口,http://www.jiwen123.com
        /// </summary>
        private void InvokeShowPhone()
        {
            comeMemInfo = new MemCard().GetModel(Str_Phone.Replace("\0", ""));
            if (comeMemInfo != null)
            {
                Phone phone = new Phone();
                phone.MemInfo = comeMemInfo;
                string condi = "MemID=" + comeMemInfo.CardID;
                phone.condition = condi.Split("|".ToCharArray());
                phone.ShowDialog();
            }
        }

转载于:https://www.cnblogs.com/IT-SmallBird/archive/2012/04/16/2451951.html

来电弹屏--线程间操作无效: 从不是创建控件的线程访问它相关推荐

  1. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  2. 线程间操作无效: 从不是创建控件的线程访问它

    转自原文 线程间操作无效: 从不是创建控件的线程访问它. using System; using System.Collections.Generic; using System.ComponentM ...

  3. 【转】“线程间操作无效: 从不是创建控件的线程访问它”

    经典解决"线程间操作无效: 从不是创建控件的线程访问它" 在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个 ...

  4. 线程间操作无效: 从不是创建控件的线程访问它。

    private void button1_Click(object sender, EventArgs e){//报错:从不是创建控件的线程访问它Thread t = new Thread(() =& ...

  5. c#报错 :System . Invalid Operation Exception:“线程间操作无效: 从不是创建控件的线程访问它

    一.问题来源 跨线程操作时会报错:System.InvalidOperationException:"线程间操作无效: 从不是创建控件的线程访问它. 二.问题代码 using System; ...

  6. 线程间操作无效,从不是创建控件的线程访问它。

    最近在开发项目时用到了操作线程的问题,在新线程中写入了操作控件的代码如: this.btnToolUpload.Enabled = true; 但是在线程执行过程中,当执行到这段代码时提示:" ...

  7. C# WinForm 线程间操作无效: 从不是创建控件的线程访问它的解决办法

    .net2后是不能跨线程访问控件的.,窗体上的控件是当前线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会 ...

  8. c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决

    如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的 ...

  9. C#线程间操作无效: 从不是创建控件 XX 的线程访问它

    转自:http://www.arasplm.net/index.php/zh/community/myblog/c-xx-.html 前些天做的要使用到线程的项目,现在和大家分享一下感受! 以下面小列 ...

  10. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”...

    "System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: ...

最新文章

  1. YUM安装多个(多实例) Mysql
  2. solr导入mysql数据库
  3. 【译】Writing a Simple Linux Kernel Module
  4. JS中fori和forEach跳出循环的问题
  5. Topshelf创建Windows服务
  6. 分析数据库CitusDB:提供弹性计算能力
  7. Oracle学习总结(5)—— SQL语句经典案例
  8. 如何迅速定位***路由器故障
  9. 【华为机试真题 Python实现】九宫格按键输入【2022 Q1 Q2 Q3 |200分】
  10. 装机配置相关---激活win7旗舰版 office
  11. java基础,进阶(二)
  12. 外卖骑手是如何被外卖企业逼向死亡之路的?
  13. 你轻轻哼唱一句,都是最美的一首歌
  14. 对 Linux 初级、中级、高级用户非常有用的 60 个命令
  15. 干货收藏 | 如何写一份专业的技术简历
  16. 利用PS快速去除图片中的红章子
  17. 浅析Java代码审计中的SQL注入漏洞
  18. HTML无害化和Sanitize模块
  19. Android蓝湖图片格式,蓝湖+PS 实现自动化切图
  20. 几个CPU常见故障分析,如何处理呢

热门文章

  1. 自适应simpson积分
  2. 私有云Openstack介绍及搭建
  3. 【转】2008'中国地理信息系统优秀工程公示
  4. springboot上传图片到阿里云OSS并实现浏览器预览
  5. linux sox录音时间控制,SOX的一些命令和kaldi使用sox音频数据增强
  6. AutoIt教程资源及autoit学习方法
  7. alot英文怎么读_alot...of是什么意思
  8. 暗黑3 和社群服务器连线中断,进入《暗黑3夺魂之镰》必须知道10件事
  9. 在 FlashGot 中调用 Axel 下载
  10. Android实例精讲——通过ListView构造微信聊天界面视图