首页 > 编程语言 >C#让标题栏闪烁着动起来的方法

C#让标题栏闪烁着动起来的方法

时间:2024-04-06 12:58:05浏览次数:21  
标签:函数 C# FlashWindow DllImport 标题栏 new 闪烁 闪烁着

目录

1.API函数FlashWindow

(1)添加命名空间

(2)声明DllImport方法

(3)FlashWindow函数

2.P/Invoke

3.再来一个示例


        在Windows系统中,当程序在后台运行时,如果某个窗体的提示信息需要用户浏览,该窗体就会不停地闪烁,这样就会吸引用户的注意。同样,如果在自己的程序中使某个窗体不停地闪烁也会吸引用户的注意。

1.API函数FlashWindow

        API函数FlashWindow用于闪烁窗口。该函数通过在窗口上显示和隐藏光标来实现闪烁效果。        

(1)添加命名空间

        在C#中,可以调用Windows API中的FlashWindow函数。首先添加以下命名空间以使用DllImport特性:

using System.Runtime.InteropServices;

(2)声明DllImport方法

        接下来,声明FlashWindow函数的DllImport方法:

[DllImport("user32.dll", SetLastError = true)]
public static extern bool FlashWindow(IntPtr hWnd, bool bInvert);

         声明DllImport时,VS会提示警告信息:SYS1054,并建议修改为LibraryImport。不要理睬,因为修改后更严重。作者认为不是微软的普遍性建议错了,而是最新的LibraryImport不适合C++的原生方法FlashWindow(C++跟不上发展了)。对于FlashWindow只能使用古老的DllImport P/Invoke 源生成器 

(3)FlashWindow函数

        现在,您可以使用以下示例代码在C#中使用FlashWindow函数:

// 让窗体闪烁起来
using System.Runtime.InteropServices;
namespace _168_2
{
    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool FlashWindow(IntPtr hWnd, bool bInvert);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string? lpClassName, string lpWindowName);

        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);
            // 获取当前窗口的句柄
            IntPtr hWnd = FindWindow(null, "新建文本文档 - 记事本");

            if (hWnd != IntPtr.Zero)
            {
                while (true)
                {
                    // 闪烁窗口
                    FlashWindow(hWnd, true);
                    Console.WriteLine("窗口闪烁成功!");
                    // 等待2秒钟
                    Thread.Sleep(2000);
                }
            }
            else
            {
                Console.WriteLine("未找到指定的窗口。");
            }
            Console.ReadKey();
        }
    }
}

        本实例运行之前,打开一个记事本文件,空白的,其标题栏显示:"新建文本文档 - 记事本"。然后运行本程序,如果找到了这个记事本文件,控制台显示“窗口闪烁成功”并记事本文件的的标题栏同步闪烁。否则,结果相反。

2.P/Invoke

        P/Invoke(Platform Invoke)是一种由.NET框架提供的技术,用于调用本机代码(即非托管代码)。它允许托管应用程序(即由.NET运行时管理的代码)访问本机API函数,例如Windows API函数。
        当托管应用程序使用P/Invoke调用本机函数时,.NET运行时会将托管代码与本机代码之间进行转换,确保两种类型的代码可以相互交互。这涉及处理诸如内存分配,数据类型和异常处理等底层细节。
        为了使用P/Invoke,需要使用DllImport属性将本机函数导入托管代码中。DllImport属性指示该函数的名称,它所在的库以及传递给该函数的参数的类型。一旦导入了本机函数,就可以像调用托管函数一样调用它。但是,需要确保本机函数的签名与在DllImport属性中指定的签名匹配,包括参数的数量和类型以及返回类型。

3.再来一个示例

        本实例设计了一个闪烁的窗体标题栏,运行本实例,单击“开始闪烁”按钮,窗体标题栏就会不停地闪烁;单击“停止闪烁”按钮,窗体标题栏就会停止闪烁。

// 闪烁的标题栏
using System.Windows.Forms;

namespace _168
{
    public partial class Form1 : Form
    {
        private PictureBox? pictureBox1;
        private Button? button1;
        private Button? button2;
        private System.Windows.Forms.Timer? timer1;

        public Form1()
        {
            InitializeComponent();
            StartPosition = FormStartPosition.CenterScreen;
            Load += Form1_Load;
        }

        //重写API函数,用来实现窗体标题栏闪烁功能
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool FlashWindow(IntPtr handle, bool bInvert);

        private void Timer1_Tick(object? sender, EventArgs e)
        {
            FlashWindow(Handle, true);//启用窗体闪烁函数
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            timer1!.Enabled = true;//启动计时器
        }

        private void Button2_Click(object? sender, EventArgs e)
        {
            timer1!.Enabled = false;//关闭计时器
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(45, 50),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 1,
                Text = "开始闪烁",
                UseVisualStyleBackColor = true
            };
            button1.Click += new EventHandler(Button1_Click);
            // 
            // button2
            // 
            button2 = new Button
            {
                Location = new Point(150, 50),
                Name = "button2",
                Size = new Size(75, 23),
                TabIndex = 2,
                Text = "停止闪烁",
                UseVisualStyleBackColor = true
            };
            button2.Click += new EventHandler(Button2_Click);

            // 
            // pictureBox1
            // 
            pictureBox1 = new PictureBox
            {
                Dock = DockStyle.Fill,
                Location = new Point(0, 0),
                Name = "pictureBox1",
                Size = new Size(325, 127),
                TabIndex = 0,
                TabStop = false
            };
            pictureBox1.Controls.Add(button2);
            pictureBox1.Controls.Add(button1);
            
            // 
            // timer1
            // 
            timer1 = new System.Windows.Forms.Timer(components);
            timer1.Tick += new EventHandler(Timer1_Tick);
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(266, 155);
            
            Controls.Add(pictureBox1);
            Name = "Frm_Main";
            Name = "Form1";
            Text = "闪烁的标题栏";
            ResumeLayout(false);
        }
    }
}

标签:函数,C#,FlashWindow,DllImport,标题栏,new,闪烁,闪烁着
From: https://blog.csdn.net/wenchm/article/details/137124755

相关文章

  • cloud.heytap.com 欢太云 优化存储空间 原图
    经检查屏幕截图是不会优化/压缩的本地的屏幕截图跟云上的是同样大小的(相机拍摄的会压缩)        ......
  • C++之路
    C++与C语言的区别: C语言是面向过程的,面向函数的封装和函数的顺序调用的过程;c++面向对象开发即面向类开发——一个结构体就是一个对象,包含行为(函数),和属性(变量);  C++能够对函数进行重载,可以使用同名的函数,功能变得更强大,c++引入了名字空间,可以是定义的变量名更多(提升变量......
  • 实战培训班:AIGC-Stablediffu+PS服装设计-服装设计师的人工智能课(16节)
    课程内容:1_一、先导片:课程介绍及课前准备-认识AI人工智能.mp42_二、Stablediffusion-基础学习-Stablediffusio运行的电脑配置要求.mp43_二、Stablediffusion-基础学习-Stablediffusio安装部署及注意事项.mp44_二、Stablediffusion-基础学习-SD-仙宫云部署.mp45_二、Stabl......
  • 【c++】初阶模版与STL简单介绍
    ......
  • 2024年的ChatGPT
    2024年的ChatGPTOpenAI:Getinstantanswers,findcreativeinspiration,learnsomethingnew.趁着这几天还能上去官网,就来在四月份再次评测一下OpenAI的这款产品。[1]2022年,一篇博客悄然问世。ChatGPT在2022年到2024年变化很大,一共有四次乃至以上的界面变化,模型和功......
  • 基于Chrome的Easy Scraper插件抓取网页
    背景     爬虫程序,又称为网络爬虫或爬虫(spider),是一种自动化程序,主要用于向网站或网络发起请求,获取资源后分析并提取有用数据。从技术层面来看,爬虫程序通过模拟浏览器请求站点的行为,把站点返回的HTML代码、JSON数据、二进制数据(如图片、视频)爬取到本地,进而提取并存储自己需要......
  • 微软安全开发流程(Security Development Lifecycle, SDL)
    1.SDL简介SecurityDevelopmentLifecycle(SDL)是微软2004年提出的从安全角度指导软件开发过程的管理模式。SDL是一个安全保证的过程,其重点是软件开发,在开发的所有阶段都引入了安全和隐私的原则。SDL一直都是微软在全公司实施的强制性策略。2.SDL步骤SDL中的方法,试图从安全漏......
  • go~在阿里mse上使用redis.call
    相关依赖github.com/higress-group/proxy-wasm-go-sdkgithub.com/alibaba/higress/plugins/wasm-go标准的redis下面是一个读取redis指定key的方法,使用了higress的wasm-go组件实现的 err:=config.Client.SMembers("online",func(responseresp.Value){ for_,item:=......
  • Golang Context是什么
    一、这篇文章我们简要讨论Golang的Context有什么用1、首先说一下Context的基本作用,然后在讨论他的实现(1)数据传递,子Context只能看到自己的和父Context的数据,子Context是不能看到孙Context添加的数据。(2)父子协程的协同,比如同时取消父子协程。2、基本数据结构Context......
  • scoped原理及使用
    一、什么是scoped,为什么要用在vue文件中的style标签上,有一个特殊的属性:scoped。当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染。二、scoped的原理1、为组件实例生成一个唯一标识,给组件中的每个标签对应......