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)这里鼠标会变成漏斗,
请问如何去除这种情况?
希望晓得的人能够提供帮助,谢谢。
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)这里鼠标会变成漏斗,
请问如何去除这种情况?
希望晓得的人能够提供帮助,谢谢。
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..";
}
}
方法是可以的,但http://www.ciker.net已经关闭该功能了
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
或许对高手们来说,我这个是个小问题。希望高手们帮我解决下。
同时,前面回答多线程的都有分。我只能通过这个方式来感谢你们。
谢谢。
还有第一个问题好像都没有比较好的答案。
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