GDI+桌面画图
很簡陋的一共桌面畫圖工具。
在桌面畫圖主要需要用到GetDC這個API,該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,以后可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。
通過該函數是為了獲取桌面的繪圖圖面。然后用鉤子勾住鼠標全局事件,進行畫線。效果很差,其他Paint消息會將自己畫的線重繪掉。
看了一些方案說是需要創建一共全屏窗體,然后重繪桌面背景到窗體。再窗體下方響應鼠標事件。難度較大,后續會嘗試下。
效果如下:
主要代碼如下:
?
class DeskTopDraw{private static DeskTopDraw dtd = null;private static readonly object locker = new object();public static DeskTopDraw GetInstance(){lock (locker){if (dtd == null)dtd = new DeskTopDraw();}return dtd;}/// <summary>/// 該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,/// 以后可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。/// </summary>/// <param name="hWnd"></param>/// <returns></returns>[DllImport("User32.dll")]private extern static IntPtr GetDC(System.IntPtr hWnd);/// <summary>/// 畫筆/// </summary>public Pen p = new Pen(Brushes.Red, 5);Point start = new Point();Point end = new Point();MouseHook mouseHook = new MouseHook();private DeskTopDraw(){ }public bool Init(){//設置筆的屬性,避免出現“毛刺” p.StartCap = LineCap.Round;p.EndCap = LineCap.Round;p.LineJoin = LineJoin.Round; mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);mouseHook.Start();return mouseHook.IsStarted;}public void Uinit(){mouseHook.Stop();}/// <summary>/// 是否開始繪制/// </summary>bool isDraw = false;List<Point> ls = new List<Point>();void mouseHook_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){//鼠標左鍵點下 則開始繪制isDraw = true;start = e.Location;//記錄開始位置}}void mouseHook_MouseMove(object sender, MouseEventArgs e){if (isDraw){end = e.Location;//記錄結束位置IntPtr DesktopHandle = GetDC(IntPtr.Zero);//獲取桌面上下文句柄Graphics g = System.Drawing.Graphics.FromHdc(DesktopHandle);//創建畫板g.SmoothingMode = SmoothingMode.AntiAlias;g.DrawLine(p, start, end);//畫線start = end;//將結束位置再次作為開始位置g.ReleaseHdc(DesktopHandle);//釋放上下文g.Dispose();}}void mouseHook_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isDraw = false;}}}?
窗體代碼如下:
public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){DeskTopDraw dt = DeskTopDraw.GetInstance();if (!dt.Init())MessageBox.Show("初始化失敗");}private void Form1_FormClosed(object sender, FormClosedEventArgs e){//不釋放也可以,其內部綁定了Application_ApplicationExit事件DeskTopDraw dt = DeskTopDraw.GetInstance();dt.Uinit();}private void button2_Click(object sender, EventArgs e){DeskTopDraw dt = DeskTopDraw.GetInstance();dt.Uinit();} }鉤子類請參考
http://blog.csdn.net/q317379184/article/details/47979309?
?
?
總結
- 上一篇: 管理和理解 suspect_pages
- 下一篇: 即插即用计算机自动识别,电脑向导未能检测