当前位置: 代码迷 >> C# >> 怎么在桌面上绘图使得所绘的图不消失
  详细解决方案

怎么在桌面上绘图使得所绘的图不消失

热度:41   发布时间:2016-05-05 03:02:44.0
如何在桌面上绘图使得所绘的图不消失
下面是桌面绘图的参考代码:

 [DllImport("User32.dll")]
     public extern static IntPtr GetDC(System.IntPtr hWnd);
    
     private void button12_Click(object sender, EventArgs e)
     {
     IntPtr DesktopHandle = GetDC(IntPtr.Zero);
     Graphics g = System.Drawing.Graphics.FromHdc(DesktopHandle);
     g.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100);
     } 



出现问题:一刷新就没有
该问题的尝试解决方法:用timer进行刷新。
方法结果:闪烁

所以我去找如何解决闪烁的问题,他们说:双缓存。
下面是双缓存的参考代码:

 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
     this.UpdateStyles();



出现问题:this这边是form,如果要桌面双缓存,那么应该把this变成桌面。
该问题的尝试解决方法:根据句柄获取桌面,然后替换this
下面是尝试的参考代码:

  [DllImport("User32.dll")]
     public extern static IntPtr GetDC(System.IntPtr hWnd);
private void supportDraw(){
  IntPtr lDesktopHandle = GetDC(IntPtr.Zero);
Form lDesktop=Form.FromHandle(lDesktopHandle) as Form;
lDesktop.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
lDesktop.UpdateStyles();
}

又出现问题:它说,SetStyle必须是所在的Class的Form【这边的话是翻译了一下,有可能说的有不对的地方】
结果:逻辑上这条路我感觉行不通。

所以来求助了!
谢谢。
------解决思路----------------------
桌面是Window,Form也是Window,但桌面不是Form,所以转不成Form。其实用Spy++看看ClassName就知道了。

不知道你为什么要在桌面绘图,其实有很多其它的解决方法,比如,弄个无框的Form,设为最顶层,背景设置为桌面的示截图,再在上面绘图,。比如,弄个窗体,直接在上面绘图,并设置为最下层...根据不同的需求,应该有很多简单的解决方案。

如果一定要在桌面上绘图,你应该学习一下hook,原理是在桌面所在进程注入一个函数,代替原来桌面的wndproc,处理WM_PAINT消息。当然,这是流氓做法,而且hook系统进程不知道能不能成功。
------解决思路----------------------
把你要画的东西画到form上,然后用UpdateLayeredWindow函数更新你的form即可,这是通用的做法
参考代码:金鱼
  相关解决方案