1.如何通过代码获取本机的外网IP,不要回答什么通过软件或者通过网页。
2.  IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); 
    SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, IntPtr.Zero, hBmp); 
    SendMessage(hWndC, WM_CAP_SEQUENCE, IntPtr.Zero, IntPtr.Zero); 
    进行录像的时候,SendMessage(hWndC, WM_CAP_SEQUENCE, IntPtr.Zero, IntPtr.Zero)这里鼠标会变成漏斗,
     请问如何去除这种情况?
     希望晓得的人能够提供帮助,谢谢。

解决方案 »

  1.   

    获取外网IP:
    string ip = GetIP;
    MessageBox.Show(ip);
    =============================================================================static string GetIP()
    {
    Uri uri = new Uri("http://www.ciker.net/ip/index.asp");
    System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri);
    req.Method = "POST";
    req.ContentType = "application/x-www-form-urlencoded";
    req.ContentLength = 0;
    req.CookieContainer = new System.Net.CookieContainer();
    req.GetRequestStream().Write(new byte[0], 0, 0);
    System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)(req.GetResponse());
    StreamReader rs = new StreamReader(res.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));
    string s = rs.ReadToEnd();
    rs.Close();
    req.Abort();
    res.Close();
    System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(s, @"您的IP:(?<IP>[0-9\.]*)");
    if (m.Success)
    {
    return m.Groups["IP"].Value;
    }
    else
    {
    return "Failed..";
    }
    }
      

  2.   


    方法是可以的,但http://www.ciker.net已经关闭该功能了
      

  3.   

    你必须通过公网的服务器告诉你ip,或者自己的服务器告诉你他的ip。
      

  4.   

    http://www.ip138.com/这个网站能告诉你外网地址, 用代码提取ip地址
      

  5.   

    目前第二个问题已经解决,但是还没有完好的解决,出现了个让我郁闷的地方。使用了多线程后。是不卡了。但是在结束的时候报异常。具体看代码:
    private void btnVideo_Click(object sender, EventArgs e)
            {
                if (txtVideoPath.Text.Trim() != "")
                {
                    if (Video)
                    {
                        VideoBegin(txtVideoPath.Text.Trim());
                    }
                    else
                    {
                        MainForm.SendMessage(hwndc, WM_CAP_DRIVER_CONNECT, 0, 0);
                    }
                }
                else
                {
                    MessageBox.Show("请先选择视频的保存路径!", "系统提示");
                }
            }
            /// <summary>
            /// 开始录像
            /// </summary>
            /// <param name="path">保存路径</param>
            private void VideoBegin(string path)
            {
                SaveVideoFileDialog = new SaveFileDialog();
                SaveVideoFileDialog.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
                SaveVideoFileDialog.Filter = "*.avi|*.avi";
                if (SaveVideoFileDialog.ShowDialog() == DialogResult.OK)
                {
                    StartThread();
                }
                this.Cursor = Cursors.Arrow;        }        private void btnSaveVideo_Click(object sender, EventArgs e)
            {
                Video = true;
                StopThread();
            }
            /// <summary>
            /// 保存录像
            /// </summary>
            private void VideoSave()
            {
                MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);
            }        #region 线程
            /// <summary>
            /// 启动线程
            /// </summary>
            public void StartThread()
            {
                StopThread();
                timerThread = new Thread(new ThreadStart(UpdateThread));
                //获取或设置一个值,该值指示某个线程是否为后台线程。
                timerThread.IsBackground = true;
                timerThread.Start();
                Video = false;
            }
            /// <summary>
            /// 停止线程
            /// </summary>
            private void StopThread()
            {
                if (timerThread != null)
                {
                    //这里进行视频的保存
                    VideoSave();
                    Video = true;                //中断线程
                    timerThread.Interrupt();
                    //杀死线程-----到了这里就报异常
                    timerThread.Abort();
                    timerThread = null;            }
            }
            /// <summary>
            /// 更新线程
            /// </summary>
            public void UpdateThread()
            {
                try
                {
                    //在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
                    MethodInvoker mi = new MethodInvoker(this.ThreadStartVideo);
                    while (true)
                    {
                        //在创建控件的基础句柄所在线程上异步执行指定的委托
                        this.BeginInvoke(mi);
                        Thread.Sleep(10);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("线程更新异常:" + ex.Message);
                }
            }        public void ThreadStartVideo()
            {
                //由于多线程会不断的循环这个执行录像,所有有个标识来判断
                if (Video)
                {
                    //保存录像
                    SendMessage(hwndc, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, SaveVideoFileDialog.FileName);
                    SendMessage(hwndc, WM_CAP_SEQUENCE, 0, 0);
                }
            }        #endregion
    或许对高手们来说,我这个是个小问题。希望高手们帮我解决下。
    同时,前面回答多线程的都有分。我只能通过这个方式来感谢你们。
    谢谢。
    还有第一个问题好像都没有比较好的答案。
      

  6.   

    希望高手们帮我看看。多线程不卡了。但是变成不能保存了。奇怪。。
    private void btnVideo_Click(object sender, EventArgs e)
            {
                if (txtVideoPath.Text.Trim() != "")
                {
                    if (Video)
                    {
                        //保存录像
                       
                        VideoBegin(txtVideoPath.Text.Trim());
                    }
                    else
                    {
                        MainForm.SendMessage(hwndc, WM_CAP_DRIVER_CONNECT, 0, 0);
                    }
                }
                else
                {
                    MessageBox.Show("请先选择视频的保存路径!", "系统提示");
                }
            }
            /// <summary>
            /// 开始录像
            /// </summary>
            /// <param name="path">保存路径</param>
            private void VideoBegin(string path)
            {
                SaveVideoFileDialog = new SaveFileDialog();
                SaveVideoFileDialog.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
                SaveVideoFileDialog.Filter = "*.avi|*.avi";
                if (SaveVideoFileDialog.ShowDialog() == DialogResult.OK)
                {
                    StartThread();
                }
                this.Cursor = Cursors.Arrow;        }        private void btnSaveVideo_Click(object sender, EventArgs e)
            {
                try
                {
                    StopThread();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            /// <summary>
            /// 保存录像
            /// </summary>
            private void VideoSave()
            {
                StopThread();
            }
            #region 线程
            public void ThreadStartVideo()
            {
                //由于多线程会不断的循环这个执行录像,所有有个标识来判断
                if (Video && timerThread != null)
                {
                    //保存录像
                    SendMessage(hwndc, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, SaveVideoFileDialog.FileName);
                    SendMessage(hwndc, WM_CAP_SEQUENCE, 0, 0);
                }        }        /// <summary>
            /// 更新线程
            /// </summary>
            public void UpdataThread()
            {
                try
                {
                    //在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
                    MethodInvoker mi = new MethodInvoker(this.ThreadStartVideo);
                    while (true)
                    {                    //在创建控件的基础句柄所在线程上异步执行指定的委托
                        this.BeginInvoke(mi);
                        Thread.Sleep(10);                }
                }
                catch (ThreadInterruptedException)
                {
                    //针对具体问题定制异常抛出显示
                }
                finally
                {
                    //做一些处理
                }
            }        /// <summary>
            /// 启动线程
            /// </summary>        
            public void StartThread()
            {
                StopThread();
                timerThread = new Thread(new ThreadStart(UpdataThread));
                //获取或设置一个值,该值指示某个线程是否为后台线程。
                timerThread.IsBackground = true;
                timerThread.Start();
                Video = false;
            }        /// <summary>
            /// 停止线程
            /// </summary>
            public void StopThread()
            {
                if (timerThread != null)
                {
                    //****************这里虽然执行了停止保存视频,但是不知道为什么没有看到视频。。
                    MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);

                    Video = true;
                    //中断线程
                    timerThread.Interrupt();
                    //杀死进程
                    timerThread.Abort();
                    timerThread = null;
                }
            }        #endregion