首页 > 编程语言 >C# 桌面上直接绘制/在屏幕上绘图和清除

C# 桌面上直接绘制/在屏幕上绘图和清除

时间:2023-08-15 11:25:38浏览次数:36  
标签:IntPtr C# CharSet 绘图 Graphics new 桌面上 true change

1、名字空间 

using System.Runtime.InteropServices;

2、API函数申明

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetDesktopWindow();//该函数返回桌面窗口的句柄。
[DllImport("user32.dll", EntryPoint = "GetDCEx", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags); //获取显示设备上下文环境的句柄

3、绘制代码

 private void button4_Click(object sender, EventArgs e)
 {
     IntPtr desk = GetDesktopWindow();
     IntPtr deskDC = GetDCEx(desk, IntPtr.Zero, 0x403);
     Graphics g = Graphics.FromHdc(deskDC);
     g.DrawString("测试", new Font("宋体", 50, FontStyle.Bold), Brushes.Red, new PointF(100, 100));
 }
我注意到绘图使用
Graphics g = Graphics.FromHwnd(form.Handle);

在其控制下在表单背景上绘制。这是你想要完成的吗?

// draw the rectangle
Brush b = new SolidBrush(Color.FromArgb(20, 0, 0, 255));
g.FillRectangle(b, new Rectangle(5, 5, 200, 200));

// clear the rectangle
g.Clear(this.BackColor);

如果我直接在屏幕上绘图,则:

Graphics g = Graphics.FromHwnd(IntPtr.Zero);

Windows 刷新屏幕后,该矩形立即消失。

还有第三种选择,这并不是很简单。

不绘制矩形,而是创建一个降低不透明度、将 TopMost 属性设置为 true 且没有边框的表单。然后使其对事件透明:

protected override void WndProc(ref Message m)
{
    const int WM_NCHITTEST = 0x0084;
    const int HTTRANSPARENT = (-1);

    if (m.Msg == WM_NCHITTEST)
    {
        m.Result = (IntPtr)HTTRANSPARENT;
    }
    else
    {
        base.WndProc(ref m);
    }
}

之后您唯一需要注意的是此表单的 Visible、Location 和 Size 属性。

bool change = false;
private void timer1_Tick(object sender, EventArgs e)
{
    try
    {
        if (change)
        {
            InvalidateRect(IntPtr.Zero, IntPtr.Zero, true);
            change = false;
        }
        else
        {
            PaintRectangleToScreen();
            change = true;
        }


    }
    catch (System.Exception caught)
    {

        MessageBox.Show(caught.Message);
    }
}

 

标签:IntPtr,C#,CharSet,绘图,Graphics,new,桌面上,true,change
From: https://www.cnblogs.com/guangzhiruijie/p/17630775.html

相关文章

  • fread实现getchar(加速!!!)
    fread实现的getchar代码:inlinecharget(){ staticcharbuf[100000],*p1=buf,*p2=buf; returnp1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}以下内容由chatgpt生成:上面的代码定义了一个名为get()的内联函数,它从标准输入......
  • C++ 调用 Python 接口 Mat转Numpy
    参考网站:https://blog.csdn.net/qq7835144/article/details/106073110?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242https://blog.csdn.net/weixin_46400740/article/details/116711323?spm=1001.2014.3001.5501 1、配......
  • 火山引擎DataLeap的Data Catalog系统公有云实践
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群DataCatalog是一种元数据管理的服务,会收集技术元数据,并在其基础上提供更丰富的业务上下文与语义,通常支持元数据编目、查找、详情浏览等功能。目前DataCatalog作为火山引擎大数据研发治......
  • 项目发布部署:如何发布.NETCore项目到IIS服务器?
    前言:本文将详细介绍如何发布.NETCore项目到IIS服务器。首先,第一步需要安装IIS,介绍了在本地电脑和服务器中进行安装。然后需要安装SDK和运行时才能发布.NETCore项目。其次介绍了如何发布.NETCore项目和Vue项目,并配置IIS。最后介绍了如何将项目部署到Service服务中。一、安装IIS......
  • DC
    DC_1√Drupal依据后面得出:192.168.40.157前置知识:IP的组成IPv4地址的典型格式是A.B.C.D,其中A、B、C和D是范围在0到255之间的十进制数。每个单独的数字对应于地址的8位二进制字段,可以表示为8位的二进制数。IPv4由网络部分和主机部分组成A.B.C表示网络部......
  • docker-compose启动开发环境
    前言经常需要搭建自己的环境,做个笔记。-操作系统:DeepinV23-Docker版本:24.0.5Gitee地址:链接启动准备1.配置Docker国内加速(配置完成重启docker)文件:/etc/docker/daemon.json{"registry-mirrors":["https://hub-mirror.c.163.com"]}2.命令行创建网络net-devdock......
  • 为什么会有 AtomicReference ?
    我把自己以往的文章汇总成为了Github,欢迎各位大佬starhttps://github.com/crisxuan/bestJavaer我们之前了解过了AtomicInteger、AtomicLong、AtomicBoolean等原子性工具类,下面我们继续了解一下位于java.util.concurrent.atomic包下的工具类。关于AtomicInteger、Ato......
  • CMakeLists语法详解
     https://www.jianshu.com/p/eb25baf5ca19set(Root"${CMAKE_CURRENT_SOURCE_DIR}")set(Base64${Root}/lib/libb64/src)include_directories(${OpenCV_INCLUDE_DIRS})include_directories(${Root})include_directories(${Root}/lib/libb64/include) include_dir......
  • VSCode如何在行内显示变量值
    背景在调试时,我们希望能够直接在代码行显示变量的值,而不是总是去侧边栏查看,如下这种,y=12直接显示在代码行。那么VSCode中如何做呢设置VSCode提供了“inlinevalues”设置,但为了速度,默认并没有开启,我们只需修改配置即可开启这个功能。效果......
  • 基于OpenCV的车牌识别系统的设计与实现
    在新世纪的大数据与人工智能高速发展之际,大数据技术以前所未有的发展速度给用户带来的各种自动化处理技术。面对如此众多的大数据与人工智能技术,非常有必要利用这些技术进行车牌识别,通过车牌识别来帮助车辆出入管理人员自动识别是否内部车辆。人工智能与大数据技术的应用,不需要车辆......