在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();
}