C# 流桌面 Activity
C# Stream Desktop Activity
为了简单起见,我决定采用这种方法。服务器在启动并单击“开始”按钮时,每秒捕获一次桌面并保存一个图像文件。启动客户端并单击“查看桌面”按钮时,每 500 毫秒将图像读入图片框。
但我在客户端表单中显示图像时遇到问题。它显示初始图像但不显示任何其他后续图像,只是保持静止。
我试过 Refresh() 和 Invalidate() 但没有任何效果。你们能帮我解决一下吗
服务器代码
using System;
using System.Windows.Forms;
using System.IO;
using System.Timers;
namespace SMSServer
{
public partial class SMSServerForm : Form
{
private static System.Timers.Timer txtTimer;
private CaptureDesktop cd;
public SMSServerForm()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
cd = new CaptureDesktop();
txtTimer = new System.Timers.Timer(1000);
txtTimer.Elapsed += txtTimer_Elapsed;
txtTimer.Enabled = true;
}
private void txtTimer_Elapsed(object sender, ElapsedEventArgs e)
{
cd.CaptureDesktopAsImage();
}
}
}
客户代码
using System;
using System.Windows.Forms;
using System.IO;
using System.Timers;
using System.Drawing;
namespace SMSClient
{
public partial class SMSClientForm : Form
{
private static System.Timers.Timer txtReadTimer;
public SMSClientForm()
{
InitializeComponent();
}
private void txtReadTimer_Elapsed(object sender, ElapsedEventArgs e)
{
desktopPictureBox.Invalidate();
desktopPictureBox.Image = Image.FromFile(Directory.GetCurrentDirectory() + @"\CurrentImage.png");
}
private void btnView_Click(object sender, EventArgs e)
{
txtReadTimer = new System.Timers.Timer(500);
txtReadTimer.Elapsed += txtReadTimer_Elapsed;
txtReadTimer.Enabled = true;
}
}
}
为了捕获桌面,我使用了此处描述的方法:
Capture desktop C# including semitransparent
更新图像后尝试方法 PictureBox.Refresh()(继承自 Control)。
Image.FromFile() 锁定文件,因此您的捕获程序可能无法在磁盘上更新它。 Open Image from file, then release lock?
这里有一些代码可用于读取文件并将其转换为图像而不锁定文件。 How to convert image in byte array
具体请看我写的末尾的那一点:
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));
为了简单起见,我决定采用这种方法。服务器在启动并单击“开始”按钮时,每秒捕获一次桌面并保存一个图像文件。启动客户端并单击“查看桌面”按钮时,每 500 毫秒将图像读入图片框。
但我在客户端表单中显示图像时遇到问题。它显示初始图像但不显示任何其他后续图像,只是保持静止。
我试过 Refresh() 和 Invalidate() 但没有任何效果。你们能帮我解决一下吗
服务器代码
using System;
using System.Windows.Forms;
using System.IO;
using System.Timers;
namespace SMSServer
{
public partial class SMSServerForm : Form
{
private static System.Timers.Timer txtTimer;
private CaptureDesktop cd;
public SMSServerForm()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
cd = new CaptureDesktop();
txtTimer = new System.Timers.Timer(1000);
txtTimer.Elapsed += txtTimer_Elapsed;
txtTimer.Enabled = true;
}
private void txtTimer_Elapsed(object sender, ElapsedEventArgs e)
{
cd.CaptureDesktopAsImage();
}
}
}
客户代码
using System;
using System.Windows.Forms;
using System.IO;
using System.Timers;
using System.Drawing;
namespace SMSClient
{
public partial class SMSClientForm : Form
{
private static System.Timers.Timer txtReadTimer;
public SMSClientForm()
{
InitializeComponent();
}
private void txtReadTimer_Elapsed(object sender, ElapsedEventArgs e)
{
desktopPictureBox.Invalidate();
desktopPictureBox.Image = Image.FromFile(Directory.GetCurrentDirectory() + @"\CurrentImage.png");
}
private void btnView_Click(object sender, EventArgs e)
{
txtReadTimer = new System.Timers.Timer(500);
txtReadTimer.Elapsed += txtReadTimer_Elapsed;
txtReadTimer.Enabled = true;
}
}
}
为了捕获桌面,我使用了此处描述的方法: Capture desktop C# including semitransparent
更新图像后尝试方法 PictureBox.Refresh()(继承自 Control)。
Image.FromFile() 锁定文件,因此您的捕获程序可能无法在磁盘上更新它。 Open Image from file, then release lock?
这里有一些代码可用于读取文件并将其转换为图像而不锁定文件。 How to convert image in byte array
具体请看我写的末尾的那一点:
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));