C# 实用截屏 模拟QQ抓屏 发表时间:2010-9-27 阅读数:45 网友评论:0 条 源码下载 实现的功能如下: 1、彩色光标,在.Net中实现光标嵌入资源文件需要变换一下思路。 2、可以抓到悬浮窗等LayeredWindow。 3、矩形选择,并可调整矩形的大小和位置,限定选择域不超出屏幕。已有选择的情况下,仍可以按下左键再画矩形选框,觉得这样做更加方便用户使用。 4、截屏遮罩效果。如图,矩形选择框内高亮显示,外面有遮罩效果。 5、信息提示面板,提示选择大小和当前点的RGB值。 6、右键菜单。 7、关于csharpwin截屏,它是个很好的截屏控件。 效果图: 实现原理 在没做过截屏之前,感觉这个功能挺神秘、高深的。做过之后感觉挺简单的。当用户点击了截屏之后,就打开一个无边框的窗口,让它占据整个屏幕,背景就用抓得的当前屏幕的全图。然后再在上面画矩形,判断鼠标的位置和行为来变化光标和调整矩形的大小位置,就好像是在屏幕上选择一样。用户双击之后,通矩形选择域来确定最终截图。关于截屏遮罩效果,这个其实也简单,在不明白之前,想破脑袋也没个思路,明白之后是真简单。抓屏幕全图的时候,保存两份,一份加上遮罩效果,其实就是用只有alpha分量的颜色填充一遍,用这一份做为窗口背景。另一份的作用是截取图,当用户画完矩形后,从中截取出相应的矩形图,然后画在无边框窗口的矩形内,这样就成了高亮显示。 实现过程 1、截屏窗口MyCaptureForm 定义变量和初始化 1. private Rectangle currRect= Rectangle.Empty; //所画矩形 2. private int ControlBlockIndex = -1; //控制点索引 3. private Point point; 4. private Point distance; //移动时鼠标与矩形的距离 5. private Cursor curRGB; //彩色光标 6. private Image image = null; //所截屏幕图 7. private Image infoPanelPic;//提示面板 8. private string currPixel; //当前像素的RGB信息 9. private bool isMouseDown=false;//鼠标左键是否按下 10. 11. public Image Image 12. { 13. get { return this.image; } 14. } 15. /// 16. /// 遮罩层颜色 17. /// 18. private SolidBrush mask = new SolidBrush(Color.FromArgb(100,0,0,0)); 19. /// 20. /// 原始屏幕图 21. /// 22. private Image ScreenImage; 23. 24. public MyCaptureForm() 25. { 26. InitializeComponent(); 27. 28. //双缓冲绘制,避免闪烁 29. this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 30. //无边框 31. this.FormBorderStyle = FormBorderStyle.None; 32. //不在任务栏中显示,用户按开始键或Ctrl+Tab时 33. this.ShowInTaskbar = false; 34. //置于顶层 35. this.TopMost = true; 36. //窗口布满整个屏幕 37. this.StartPosition = FormStartPosition.Manual; 38. this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 39. //查看任务管理器时用 40. //this.Height -= 30; 41. //接受键盘输入,用于快捷键,如Esc 42. this.KeyPreview = true; 43. 44. //保留原来 45. ScreenImage=GetScreenImage(); 46. //将当前屏做为背景 47. Image BackScreen = new Bitmap(ScreenImage); 48. Graphics g= Graphics.FromImage(BackScreen); 49. //画遮罩 50. g.FillRectangle(this.mask, 0, 0, BackScreen.Width, BackScreen.Height); 51. g.Dispose(); 52. this.BackgroundImage = BackScreen; 53. //彩色光标 54. curRGB = new Cursor(winStudy.Properties.Resources.Arrow_M.Handle); 55. Cursor = curRGB; 56. toolTip1.SetToolTip(this, "按住左键不放选择截图区域,可重复选择"); 57. } 关于GetScreenImage(),查看。 2、事件处理 1. protected override void OnMouseDown(MouseEventArgs e) 2. { 3. if (e.Button == MouseButtons.Left) 4. { 5. //记录左键已按下 6. //记录鼠标位置 7. //设置光标 8. //第一次画/重新画 9. } 10. base.OnMouseDown(e); 11. } 12. //鼠标移动 13. protected override void OnMouseMove(MouseEventArgs e) 14. { 15. //取当前点的RGB值 16. if (鼠标按下) 17. { 18. //调整矩形大小和位置 19. } 20. else 21. { 22. //根据情况改变光标 23. //显示当前点的RGB值 24. } 25. base.OnMouseMove(e); 26. } 27. protected override void OnMouseUp(MouseEventArgs e) 28. { 29. //右键释放 30. if (e.Button == MouseButtons.Right) 31. { 32. //取消选择 33. //退出截屏 34. } 35. else if (e.Button == MouseButtons.Left) 36. { 37. //左键抬起 38. //完成选择并整理矩形,使其定位点为左上 39. //变化光标 40. } 41. base.OnMouseUp(e); 42. } 43. protected override void OnPaint(PaintEventArgs e) 44. { 45. //判空 46. //画突出显示的部分 47. //画矩形 48. //画控制点 49. //画信息面板 50. //顺序不能改变 51. base.OnPaint(e); 52. } 53. //双击截图 54. private void MyCaptureForm_DoubleClick(object sender, EventArgs e) 55. { 56. this.image = Bitmap; 57. this.DialogResult = DialogResult.OK; 58. } 59. // 快捷键 Esc取消选择/退出 60. protected override void OnKeyUp(KeyEventArgs e) 61. { 62. if (e.KeyData == Keys.Escape) 63. { 64. ExitForm(false); 65. } 66. base.OnKeyUp(e); 67. } 68. // 右键菜单 69. //保存为文件 70. private void mitemSaveFile_Click(object sender, EventArgs e) 71. { } 72. //退出截屏 73. private void mitemCancel_Click(object sender, EventArgs e) 74. { 75. this.DialogResult = DialogResult.Cancel; 76. } 参考资料: LanMsg C#仿QQ截屏 C#抓悬浮窗 C# 彩色光标嵌入资源文件 csharpwin截屏 效果图: 关于csharpwin截屏的更多介绍。 开发环境:VS2005