在Window上有一些软件可以在计算机屏幕上画图,这是怎么做的呢?我查了一些相关的资料,发现,实际上在Window系统上跟本就不可能直接向计算机的显示器屏幕输出自己所绘的图,那些在DOS时代用系统中断的做法在Window上不行了!!!那么那些软件是怎么画的呢,实际上有很多软件采用了我在这里的一个做法.如果有兴趣可以试试哟:)
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms;
namespace BitBltScreen { /// <summary> /// ShowScreen 的摘要说明。 /// </summary> public class ShowScreen : System.Windows.Forms.Form { private const int SRCCOPY = 0xCC0020;
[System.Runtime.InteropServices.DllImportAttribute("User32.dll")] private static extern IntPtr GetDesktopWindow();
[System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern long BitBlt (IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
[System.Runtime.InteropServices.DllImportAttribute("User32.dll")] private static extern IntPtr GetDC(IntPtr hWnd);
[System.Runtime.InteropServices.DllImportAttribute("User32.dll")] private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
private Bitmap m_Image;//临时用的位图 private Point m_SPoint;//画线的起始点 private Point m_EPoint;//画线的结束点 private Graphics m_Graphics;//画线用的图形对象 private Color m_LineColor; private System.Windows.Forms.ContextMenu contextMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2;
/// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.Container components = null;
public ShowScreen() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); this.Location = new Point(0,0); this.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
m_LineColor = Color.FromArgb(255,0,0);//初始化的红色 }
#region Windows 窗体设计器生成的代码 /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); }
/// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.contextMenu1 = new System.Windows.Forms.ContextMenu(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); // // contextMenu1 // this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2}); // // menuItem1 // this.menuItem1.Index = 0; this.menuItem1.Text = "CopyScreen(&C)"; this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click); // // menuItem2 // this.menuItem2.Index = 1; this.menuItem2.Text = "Exit(&E)"; this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click); // // ShowScreen // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(292, 270); this.ContextMenu = this.contextMenu1; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "ShowScreen";
} #endregion
private void menuItem1_Click(object sender, System.EventArgs e) { LoadScreen(); }
private void menuItem2_Click(object sender, System.EventArgs e) { this.Close(); }
public void LoadScreen() { IntPtr desk = GetDesktopWindow();//得到计算机的顶级窗口 IntPtr screenDC = GetDC(desk);//得到窗口的画图设备句柄
//生成一个和屏幕大小一样的位图 m_Image = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics g = Graphics.FromImage(m_Image);//从这个位图建立一个画图对象 IntPtr theDC = g.GetHdc();//得到这位图的画图对象设备句柄 //把顶级窗口的拷贝放到位图里面,以备重画时使用 long tmpLong = BitBlt(theDC, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, screenDC, 0, 0, SRCCOPY);
g.ReleaseHdc(theDC);//删除位图画图设备句柄 ReleaseDC(this.Handle, screenDC);//删除顶级窗口画图设备句柄 }
protected override void OnPaint(PaintEventArgs e) { base.OnPaint (e); //窗口重画时绘制位图 if (m_Image != null) { e.Graphics.DrawImage(m_Image,0,0); } }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown (e); //鼠标按下的时候记下画线起点 m_SPoint = new Point(e.X, e.Y); //建立画图用的对象 if (m_Graphics == null) { m_Graphics = this.CreateGraphics(); } } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove (e); if (e.Button == MouseButtons.Left) { //如果鼠标左键按下就画图,这里是一条红色的直线 m_Graphics.DrawImage(m_Image,0,0);//这里这么调用就是为了清除原来的线,我不知道怎么做更好,所以... Point tmpPoint = new Point(e.X, e.Y); m_Graphics.DrawLine(new Pen(m_LineColor), m_SPoint, tmpPoint);//画一条新的线.
m_EPoint = tmpPoint;//记下新的点 } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp (e); //在鼠标键抬起时到到位图上记下来 Graphics tmpGraphics = Graphics.FromImage(m_Image); tmpGraphics.DrawLine(new Pen(m_LineColor), m_SPoint, m_EPoint); } } }
这时就可以把代码复制下来试试喽,哈~哈~
不过在使用时,要先把屏幕取下来哟,要不就没有效果了:) private void button1_Click(object sender, System.EventArgs e) { ShowScreen ss = new ShowScreen(); ss.LoadScreen(); ss.Show(); }

|