当前位置: 代码网 > it编程>编程语言>C# > C#实现标题闪烁效果的示例代码

C#实现标题闪烁效果的示例代码

2024年05月15日 C# 我要评论
在windows系统中,当程序在后台运行时,如果某个窗体的提示信息需要用户浏览,该窗体就会不停地闪烁,这样就会吸引用户的注意。同样,如果在自己的程序中使某个窗体不停地闪烁也会吸引用户的注意。1.api

在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#实现标题闪烁效果的示例代码的详细内容,更多关于c#标题闪烁的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com