学了c和sdk,发现还是不够写出一个截屏软件!!!!
把小甲鱼的带你学c带你飞买来基本学完,然后看完sdk的视频,发现还是不能实现我只想要写一个截屏软件的愿望!!!花了半年的时间啊!一个类似windows自带的截屏软件就这么难吗?求大家帮我一下,需要用到那些api消息和函数,我自己去查了看是否能自己写出来,谢谢了。 自行百度,可以弄,就是狠复杂的说 gdi+有相关的函数,也可通过Cimage类来实现。 wp231957 发表于 2022-3-22 05:26自行百度,可以弄,就是狠复杂的说
哎。。。花了很久很久的时间学,就这一个小软件都搞不定,百度查起来资料也是非常乱。。 zzxhh628 发表于 2022-3-22 08:48
gdi+有相关的函数,也可通过Cimage类来实现。
能具体一点不,麻烦了。。。 首先gdi来实现截图,用Cimage类实现保存图片。这个类是ATL/MFC里面有的,包含上atlimage.h头文件就能使用Cimage类。gdi部分就是先用GetDC获取桌面窗口的DC,CreateCompatibleDC创建兼容DC,获取屏幕宽和高用GetSystemMetrics,用CreateCompatibleBitmap创建兼容位图,用SelectObject选中位图到兼容DC,然后用BitBlt在位图上绘制。把绘制完了的兼容位图用Cimage类的Attach函数附加位图,用Save函数保存成为文件就行了。
zzxhh628 发表于 2022-3-22 12:54
首先gdi来实现截图,用Cimage类实现保存图片。这个类是ATL/MFC里面有的,包含上atlimage.h头文件就能使用Ci ...
谢谢。看来还要好好研究下。 public partial class frmScreenRoi : Form
{
/// <summary></summary>
int[] ScreenSize = new int { 0, 0, 0, 0 };
/// <summary></summary>
int[] ScreenSizePre = new int { 0, 0, 0, 0 };
/// <summary></summary>
Bitmap BackBit = null;
/// <summary> 刷新线程 </summary>
Thread thdUpdate;
/// <summary> 退出线程 </summary>
bool _isquit = false;
/// <summary> 鼠标按下 </summary>
bool _isMouseDown = false;
/// <summary> 第一次 按下+移动+释放 </summary>
bool _isFirst = true;
#region 构造
public frmScreenRoi()
{
InitializeComponent();
}
private void frmScreenRoi_Load(object sender, EventArgs e)
{
Rectangle r = Screen.PrimaryScreen.Bounds;
BackBit = new Bitmap(r.Width, r.Height);//截取的大小
Graphics g = Graphics.FromImage(BackBit);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), BackBit.Size);
//窗体最大化,及相关处理
this.Width = r.Width;
this.Height = r.Height;
this.Left = 0;
this.Top = 0;
this.TopMost = true;
ScreenSize = r.Width;
ScreenSize = r.Height;
pictureBox1.bitmap = BackBit;
thdUpdate = new Thread(Loop);
thdUpdate.Start();
}
private void frmScreenRoi_FormClosing(object sender, FormClosingEventArgs e)
{
_isquit = true;
Thread.Sleep(200);
thdUpdate?.Abort();
}
#endregion
private void Loop()
{
while (!_isquit)
{
Thread.Sleep(10);
if (_isMouseDown)
{
_isMouseDown = false;
ScreenSizePre = ScreenSize;
ScreenSizePre = ScreenSize;
this.Invoke((MethodInvoker)delegate {
pictureBox2.Location = new Point(ScreenSizePre, ScreenSizePre);
pictureBox2.Visible = true;
});
}
if (ScreenSize > 0 && ScreenSize > 0)
{
if (ScreenSize != ScreenSizePre || ScreenSize != ScreenSizePre)
{
ScreenSizePre = ScreenSize;
ScreenSizePre = ScreenSize;
this.Invoke((MethodInvoker)delegate {
pictureBox2.Size = new Size(ScreenSizePre, ScreenSizePre);
Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSizePre, ScreenSizePre, ScreenSize, ScreenSize), BackBit.PixelFormat);
pictureBox2.BackgroundImage = Bit;
});
}
}
else
{
this.Invoke((MethodInvoker)delegate {
pictureBox2.Size = new Size(0, 0);
});
}
}
}
#region 画区域
//鼠标按下
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (_isFirst)
{
_isMouseDown = true;
ScreenSize = e.X;
ScreenSize = e.Y;
//pictureBox2.Location = new Point(e.X, e.Y);
//pictureBox2.Visible = true;
}
}
//鼠标移动
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_isFirst)
{
ScreenSize = e.X - ScreenSize;
ScreenSize = e.Y - ScreenSize;
//if (ScreenSize > 0 && ScreenSize > 0)
//{
// //SuspendLayout();
// pictureBox2.Size = new Size(ScreenSize, ScreenSize);
// Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize, ScreenSize, ScreenSize, ScreenSize), BackBit.PixelFormat);
// pictureBox2.BackgroundImage = Bit;
// //ResumeLayout(true);
//}
//else
//{
// pictureBox2.Size = new Size(0, 0);
//}
}
}
//鼠标释放
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (_isFirst)
{
ScreenSize = e.X - ScreenSize;
ScreenSize = e.Y - ScreenSize;
_isFirst = false;
if (ScreenSize > 0 && ScreenSize > 0)
{
try
{
Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize, ScreenSize, ScreenSize, ScreenSize), BackBit.PixelFormat);
DateTime now = DateTime.Now;
string SavePath = PathTool.DataOutImagePath + now.ToString("yyyy-MM-dd") + "\\";
string FileName = "Screen_" + now.ToString("hhmmss_fff") + ".bmp";
if (!Directory.Exists(SavePath))
Directory.CreateDirectory(SavePath);
Bit.Save(SavePath + FileName);
Log.Instance().Enqueue("自定义截图完成,保存路径:" + SavePath + FileName, SagensColor.Black);
}
catch (Exception ex)
{
Log.Instance().Enqueue(ex);
}
}
this.Close();
}
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) this.Close();
}
private void pictureBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
this.Close();
}
private void frmScreenRoi_KeyPress(object sender, KeyPressEventArgs e)
{
this.Close();
}
#endregion
} 美琴小学生 发表于 2022-4-9 09:07
这个鼠标释放就自动保存截图了,用_isFirst 和在鼠标释放那里修改一下可以改成微信那样,拖动Roi框再保存 美琴小学生 发表于 2022-4-9 09:09
这个鼠标释放就自动保存截图了,用_isFirst 和在鼠标释放那里修改一下可以改成微信那样,拖动Roi框再保存
半透明代码没给,你可以CSDN找 额,新人,学了点python,python中有个库可以直接搞定 美琴小学生 发表于 2022-4-9 09:07
楼主问C和SDK,你贴C#
页:
[1]