代码之家  ›  专栏  ›  技术社区  ›  esac

如何在Windows桌面上直接绘图,C?

  •  14
  • esac  · 技术社区  · 15 年前

    这个问题被问到其他语言,甚至那些其他语言,我发现他们的答案缺乏正确的,干净的做(没有混乱的屏幕修复等)。

    是否可以从C_绘制到Windows桌面?如果可能的话,我正在寻找一个例子。

    3 回复  |  直到 15 年前
        1
  •  25
  •   Remco    9 年前

    尝试以下操作:

    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Runtime.InteropServices;
    
    class Program {
    
        [DllImport("User32.dll")]
        static extern IntPtr GetDC(IntPtr hwnd);
    
        [DllImport("User32.dll")]
        static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);
    
        static void Main(string[] args) {
            IntPtr desktop = GetDC(IntPtr.Zero);
            using (Graphics g = Graphics.FromHdc(desktop)) {
                g.FillRectangle(Brushes.Red, 0, 0, 100, 100);
            }
            ReleaseDC(IntPtr.Zero, desktop);
        }
    }
    
        2
  •  8
  •   leppie    15 年前

    你可以试试:

    Graphics.FromHwnd(IntPtr.Zero)
    
        3
  •  3
  •   Michael Wasser    8 年前

    您可以在 https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

    这将绘制一个矩形,该矩形将显示在屏幕上,直到用户选择在任意位置移除它(不会重新绘制)。它使用隐藏/显示为弹出窗口的Windows窗体。

    这是背后的代码 UIAVerify.exe 当前Windows SDK中的工具。

    如果要使用上述文件,请将以下文件复制到项目中:

    • utils\screenboundingrectangle.cs
    • utils\screenrectangle.cs
    • win32\*

    可能需要相应地更新命名空间+添加对 System.Drawing + System.Windows.Forms

    然后可以用以下代码绘制矩形:

    namespace Something
    {
        public class Highlighter
        {
            ScreenBoundingRectangle _rectangle = new ScreenBoundingRectangle();
            public void DrawRectangle(Rectangle rect)
            {
                _rectangle.Color = System.Drawing.Color.Red;
                _rectangle.Opacity = 0.8;
                _rectangle.Location = rect;
                this._rectangle.Visible = true;
            }
        }
    }
    

    var rect = Rectangle.FromLTRB(100, 100, 100, 100);
    var hi = new Highlighter();
    hi.DrawRectangle(rect);