C#模拟MSN窗体抖动的实现代码

C#模拟MSN窗体抖动的实现代码一般可以采用以下三个步骤:

1.获取窗体当前位置,并定义抖动偏移量;

2.在一定时间内不断改变窗体位置,实现抖动效果;

3.在抖动结束后恢复原始窗体位置。

具体实现步骤如下:

第一步:获取窗体当前位置和定义抖动偏移量

//获取窗口当前位置
Point OldPoint = this.Location;
//定义抖动偏移量,根据需求自定义抖动程度
int Offset = 8;

第二步:循环改变窗口位置,实现抖动效果

//定义变量记录循环次数
int ShakingTime = 0;
//定义抖动时间间隔
int ShakingInterval = 20;
//定义抖动次数,根据需求自定义抖动次数
int ShakingCount = 10;

while (ShakingTime < ShakingCount)
{
    //同步刷新窗口位置
    this.Location = new Point(OldPoint.X + Offset, OldPoint.Y + Offset);

    //等待一定时间间隔后恢复原始位置
    System.Threading.Thread.Sleep(ShakingInterval);
    this.Location = OldPoint;
    System.Threading.Thread.Sleep(ShakingInterval);

    //累加循环次数
    ShakingTime++;
}

第三步:恢复原始窗口位置

this.Location = OldPoint;

以上就是C#模拟MSN窗体抖动的完整攻略。

下面附上两条示例代码,第一条是在WinForm窗体的Load事件中点击button1按钮时触发抖动效果,第二条是在WPF程序中通过重写OnSourceInitialized方法实现窗体抖动效果:

示例1(WinForm):

private void button1_Click(object sender, EventArgs e)
{
    //获取窗口当前位置
    Point OldPoint = this.Location;
    //定义抖动偏移量
    int Offset = 8;
    //定义变量记录循环次数
    int ShakingTime = 0;
    //定义抖动时间间隔
    int ShakingInterval = 20;
    //定义抖动次数
    int ShakingCount = 10;

    while (ShakingTime < ShakingCount)
    {
        //同步刷新窗口位置
        this.Location = new Point(OldPoint.X + Offset, OldPoint.Y + Offset);

        //等待一定时间间隔后恢复原始位置
        System.Threading.Thread.Sleep(ShakingInterval);
        this.Location = OldPoint;
        System.Threading.Thread.Sleep(ShakingInterval);

        //累加循环次数
        ShakingTime++;
    }

    //恢复原始窗口位置
    this.Location = OldPoint;
}

示例2(WPF):

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    //获取窗口句柄
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    //定义抖动偏移量
    int Offset = 8;
    //定义变量记录循环次数
    int ShakingTime = 0;
    //定义抖动时间间隔
    int ShakingInterval = 20;
    //定义抖动次数
    int ShakingCount = 10;
    //获取窗口矩形
    Rect rect = new Rect();
    GetWindowRect(hwnd, ref rect);
    Point OldPoint = new Point(rect.Left, rect.Top);

    while (ShakingTime < ShakingCount)
    {
        //同步刷新窗口位置
        SetWindowPos(hwnd, IntPtr.Zero, (int)(OldPoint.X + Offset), (int)(OldPoint.Y + Offset), (int)rect.Width, (int)rect.Height, SWP_NOOWNERZORDER | SWP_NOZORDER);

        //等待一定时间间隔后恢复原始位置
        System.Threading.Thread.Sleep(ShakingInterval);
        SetWindowPos(hwnd, IntPtr.Zero, (int)OldPoint.X, (int)OldPoint.Y, (int)rect.Width, (int)rect.Height, SWP_NOOWNERZORDER | SWP_NOZORDER);
        System.Threading.Thread.Sleep(ShakingInterval);

        //累加循环次数
        ShakingTime++;
    }

    //恢复窗口原始位置
    SetWindowPos(hwnd, IntPtr.Zero, (int)OldPoint.X, (int)OldPoint.Y, (int)rect.Width, (int)rect.Height, SWP_NOOWNERZORDER | SWP_NOZORDER);
}

[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

private const uint SWP_NOOWNERZORDER = 0x0200;
private const uint SWP_NOZORDER = 0x0004;

private struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#模拟MSN窗体抖动的实现代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#之泛型详解

    C#之泛型详解 什么是泛型? 在C#中,泛型是一种可以通过使用类型参数实现参数化类型的编程概念。简单来说,泛型让我们可以在定义方法、类、接口时使用类型参数,使得代码可以更加通用化,避免了重复而相似的代码,提高了代码的复用率和类型安全性。 泛型的基本用法 泛型的基本语法结构是在方法或类名后面添加尖括号“<>”,里面填充泛型参数,如下所示: publ…

    C# 2023年5月15日
    00
  • .Net MVC将Controller数据传递到View

    在.Net MVC中,Controller通过Model来向View传递数据,Model通常是一个类,保存着Controller需要向View传递的数据,在Controller中创建Model,将需要传递的数据赋值给Model,再将Model传递给View。 下面我们来详细阐述“.Net MVC将Controller数据传递到View”的完整攻略: 在Con…

    C# 2023年5月31日
    00
  • C#基础知识之字符串和正则表达式

    C#基础知识之字符串和正则表达式 一、字符串 1. 字符串的定义 在 C# 中,字符串是一个不可变的对象,表示文字和其他字符序列。C# 中的字符串对象是 System.String 类型的实例。创建字符串即是创建 String 对象,并使用双引号或 @-引号字符串来表示字符串值。如: string str1 = "Hello world!&quot…

    C# 2023年6月1日
    00
  • c#使用dynamic类型优化反射的方法

    下面是详细讲解“c#使用dynamic类型优化反射的方法”的完整攻略。 1. 前言 在C#中,使用反射可以在运行时动态地获取类型信息并对这些类型进行操作,是一种强大的编程工具。但反射也有一定的缺点,使用反射访问和操作类型的性能相对较低,尤其是当需求需要重复调用反射代码时,这种性能劣势就更加明显。因此,为了更好地优化反射操作的性能,C#提供了一种dynamic…

    C# 2023年5月15日
    00
  • ASP.NET(C#) 面试总结面试题大全

    标题规范: 在markdown中,标题通过在文本前添加#号表示。一级标题需要1个#号,二级标题需要2个#号,以此类推。例如,一级标题的写法为: # 一级标题 二级标题的写法为: ## 二级标题 代码块规范: 在markdown中,代码块通过使用三个`来表示代码块的开始和结束,示例如下: public static void main(String[] arg…

    C# 2023年5月14日
    00
  • C#实现判断字符串中是否包含中文的方法

    下面是关于“C#实现判断字符串中是否包含中文的方法”的完整攻略: 方法一:使用正则表达式 正则表达式是一个强大的工具,可以用来匹配符合某种规则的文本。在C#中,可以使用正则表达式来判断字符串中是否包含中文。 下面是一个用正则表达式判断中文的示例代码: using System.Text.RegularExpressions; public bool Cont…

    C# 2023年6月8日
    00
  • 使用ASP.NET中关于代码分离的实例分享

    使用ASP.NET进行代码分离是一种将业务逻辑和UI分开的一种重要方式。这种方式能够提高代码的可读性和可维护性。 下面是ASP.NET中关于代码分离的实例分享: 步骤1:创建项目和布局 打开Visual Studio并创建一个ASP.NET MVC项目。 在此项目中,创建一个名为“Controllers”的文件夹。 在“Controllers”文件夹下创建一…

    C# 2023年5月31日
    00
  • 学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪

    优化响应行为的交互 下载WINDOWS评估和部署工具包 (Windows ADK) 保持默认安装 驱动延迟优化的基本步骤包括: 定义方案并添加 TraceLogging 事件。TraceLogging 是用于日志记录事件的系统,无需清单即可解码,TraceLogging基于windows事件跟踪(ETW),并提供检测代码的简化办法。C#可选的有.NET Ev…

    C# 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部