C#实现QQ窗体的步骤和总结

程序结构

控件布局

控件名称控件命名属性修改
FormForm1FromBorderStyle:None
Panelpanel1BackgroundImage:关联照片
Dock:Top
Panelpanel2BackgroundImage:关联照片
Panelpanel3BackgroundImage:关联照片
Dock:Bottom
timertimer1
timertimer2

代码分析

在这里插入图片描述

公共变量

        IntPtr Tem_Handle;//获取控件及窗体句柄
        Point CPoint;//获取控件中鼠标的位置
        static int Tem_place = 0;
        int Frm_Height = 0;
        int FrmHeight = 0;

API调用

调用windows系统的API函数,实现对控件句柄的操作

 //获取当前鼠标下可视化控件的句柄
        [DllImport("user32.dll")]
        public static extern int WindowFromPoint(int xPoint, int yPoint);
        //获取指定句柄的父级句柄
        [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
        private static extern IntPtr GetParent(IntPtr hWnd);
        //获取屏幕的大小
        [DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
        private static extern int GetSystemMetrics(int mVal);

公用方法

//获取当前鼠标下可视化控件的句柄.参数X代表当前鼠标的X坐标,参数Y代表当前鼠标的Y坐标
public IntPtr FromNameAt(int x,int y)
        {
            IntPtr Tem_hWind;//设置存储句柄的变量
            Tem_Handle = (IntPtr)(WindowFromPoint(x, y));//获取当前鼠标下可视化控件的句柄
            Tem_hWind = Tem_Handle;//记录原始句柄
            while(Tem_hWind !=(IntPtr)(0))
            {
                Tem_Handle = Tem_hWind;//记录当前句柄
                Tem_hWind = GetParent(Tem_hWind);//获取父级句柄
            }
            return Tem_Handle;//返回最底层的父级句柄
        }

//利用窗体上的控件移动窗体
 public void FrmMove(Form Frm,MouseEventArgs e)//Form或MouseeventArgs添加命名空间using system.Form
        {
            if(e.Button == MouseButtons.Left)
            {
                Point myPosition = Control.MousePosition;//获取当前鼠标的屏幕坐标
                myPosition.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置
                Frm.DesktopLocation = myPosition;//设置当前窗体在屏幕上的位置
                Tem_place = 0;
                this.Height = FrmHeight;
            }
        }

事件

主要是每个控件相关事件触发后的代码程序

//窗体Form1
private void Form1_Load(object sender, EventArgs e)
        {
            Frm_Height = this.Height;
            FrmHeight = this.Height;
            this.TopMost = true;
        }
//timer1
private void timer1_Tick(object sender, EventArgs e)
        {
            if(this.Top < 3 && Tem_place==0)//如果窗体被移到屏幕的顶部
            {
                if(this.Handle==FromNameAt(Cursor.Position.X,Cursor.Position.Y))//当鼠标移到该窗体上
                {
                    panel1.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
                    timer2.Enabled = false;//不对窗体进行拉伸操作
                    this.Top = 0;//使窗体置顶
                }
                else
                {
                    panel1.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
                    timer2.Enabled = true;//将窗体在顶部进行隐藏
                }
            }
            else
            {
                if(this.Left < 3 || this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的左端或右端
                {
                    if(this.Left < 3)//如果窗体被移到屏幕的左端
                    {
                        if(this.Handle == FromNameAt(Cursor.Position.X,Cursor.Position.Y))//当鼠标移到该窗体上
                        {
                            panel1.Tag = 2;//设置标识,用于判断窗体在屏幕左端
                            timer2.Enabled = false;
                            Frm_Height = this.Height;
                            this.Left = 0;//使窗体向左
                            this.Top = 0;
                            this.Height = Screen.AllScreens[0].Bounds.Height;
                            Tem_place = 1;
                        }
                        else
                        {
                            panel1.Tag = 2;
                            timer2.Enabled = true;//将窗体在左端进行隐藏
                        }
                    }
                }
                if(this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的右端
                {
                    if(this.Handle == FromNameAt(Cursor.Position.X,Cursor.Position.Y))//当鼠标移到该窗体上
                    {
                        panel1.Tag = 3;//设置标识,用于判断窗体在屏幕右端
                        timer2.Enabled = false;
                        Frm_Height = this.Height;
                        this.Left = GetSystemMetrics(0) - this.Width;//使窗体致右
                        this.Top = 0;
                        this.Height = Screen.AllScreens[0].Bounds.Height;
                        Tem_place = 1;
                    }
                    else
                    {
                        panel1.Tag = 3;
                        timer2.Enabled = true;//将窗体在右端进行隐藏
                    }
                }
            }
        }

//timer2
private void timer2_Tick(object sender, EventArgs e)
        {
            switch(Convert.ToInt16(panel1.Tag.ToString()))//对标识进行判断
            {
                case 1://顶部隐藏
            {
                if (this.Top < 5)
                    this.Top = -(this.Height - 2);
                break;
            }
                case 2://左端隐藏
                    {
                        if (this.Left < 5)
                            this.Left = -(this.Width - 2);
                        break;
                    }
                case 3://右端隐藏
                    {
                        if ((this.Left + this.Width) > (GetSystemMetrics(0) - 5))
                            this.Left = GetSystemMetrics(0) - 2;
                        break;
                    }

            }
        }
//panel3
private void panel3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
//panel1
 private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            timer1.Enabled = false;
            CPoint = new Point(-e.X, -e.Y);
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            FrmMove(this, e);
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            timer1.Enabled = true;
        }

知识总结

IntPtr

命名空间:System
程序集:System.Runtime.dll

表示一个有符号整数,其中位宽度与指针相同,用于表示指针或句柄的平台特定类型

C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。

资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。

所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。

IntPtr Tem_hWind;//设置存储句柄的变量
Tem_Handle = (IntPtr)(WindowFromPoint(x, y));//获取当前鼠标下可视化控件的句柄
Tem_hWind = Tem_Handle;//记录原始句柄

C#也可是使用IntPtr获取某个变量的指针

//用unsafe {}关键字,并设置【项目属性】-【生成】-可以执行不安全代码.
unsafe
{
    int ad;
    //跟指针p相关的变量只能出现在unsafe{}内部,外部无法使用
    int* p = &ad;//建立指针P,指向变量ad
    Console.Write((int)p);//ad的内存地址
    Console.Write(*p);//引向p指向的数据,即ad
    IntPtr op = new IntPtr((int)p);//构造C#类型的指针
    Console.Write(Marshal.ReadInt32(op));//输出的是变量ad的值
}
Console.ReadKey();

Marshal 类

命名空间:System.Runtime.InteropServices
程序集:System.Runtime.InteropServices.dll

提供了一个方法集合,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法

Point

命名空间:System.Drawing
程序集:System.Drawing.Primitives.dll

提供有序的 x 坐标和 y 坐标整数对,该坐标对在二维平面中定义一个点。

Point CPoint;
Point myPosition = Control.MousePosition;//获取当前鼠标的屏幕坐标
myPosition.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置

Offset

Point类的方法之一。将此 Point 平移指定的量。

//语法规则,Int32表示形参参数数据类型,dx代表X坐标,dy代表Y坐标
Offset(Int32 dx, Int32 dy)
Point CPoint;
CPoint.offset(120,120);
//在窗体画出线段
//定义方法offsetPoint,
private void offsetPoint(PaintEventArgs e)
{
	Point pt1 = new Point(10, 10);
    pt1.Offset(50, 0);
    Point pt2 = new Point(250, 10);
    e.Graphics.DrawLine(Pens.Red, pt1, pt2);
}
//窗体paint调用方法
private void Form1_Paint(object sender, PaintEventArgs e)
{
    offsetPoint(e);

}

PaintEventArgs 类

命名空间:System.Windows.Forms
程序集:System.Windows.Forms.dll

为 Paint 事件提供数据。

private Rectangle RcDraw;
private float PenWidth = 5;

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{

    // Determine the initial rectangle coordinates...

    RcDraw.X = e.X;
    RcDraw.Y = e.Y;
}

private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{

    // Determine the width and height of the rectangle...

    if(e.X < RcDraw.X)
    {
        RcDraw.Width = RcDraw.X - e.X;
        RcDraw.X = e.X;
    }
    else
    {
        RcDraw.Width = e.X - RcDraw.X;
    }

    if(e.Y < RcDraw.Y)
    {
        RcDraw.Height = RcDraw.Y - e.Y;
        RcDraw.Y = e.Y;
    }
    else
    {
        RcDraw.Height = e.Y - RcDraw.Y;
    }

    // Force a repaint of the region occupied by the rectangle...

    this.Invalidate(RcDraw);
}

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

    // Draw the rectangle...

    e.Graphics.DrawRectangle(new Pen(Color.Blue, PenWidth), RcDraw);
}

效果演示

在这里插入图片描述

Graphics

命名空间:System.Drawing
程序集:System.Drawing.Primitives.dll

封装一个 GDI+ 绘图图面。 此类不能被继承。

示例设计用于Windows 窗体,需要一个PaintEventArgs对象。 该 PaintEventArgs 对象已命名 e ,是事件处理程序的参数 Paint 。

private void DrawImagePointF(PaintEventArgs e)
{
             
    // Create image.
    Image newImage = Image.FromFile("SampImag.jpg");
             
    // Create point for upper-left corner of image.
    PointF ulCorner = new PointF(100.0F, 100.0F);
             
    // Draw image to screen.
    e.Graphics.DrawImage(newImage, ulCorner);
}

MouseEventArgs 类

命名空间:System.Windows.Forms
程序集:System.Windows.Forms.dll

为 MouseUp、MouseDown 和 MouseMove 事件提供数据。

MouseEventArgs 指定按下鼠标按钮、按下和释放鼠标按钮的次数、鼠标坐标以及鼠标滚轮移动量

属性描述
Button获取曾按下的是哪个鼠标按钮。
Clicks获取按下并释放鼠标按钮的次数。
Delta获取鼠标轮已转动的制动器数的有符号计数乘以 WHEEL_DELTA 常数。 制动器是鼠标轮的一个凹口。
Location获取鼠标在产生鼠标事件时的位置。
X获取鼠标在产生鼠标事件时的 x 坐标。
Y获取鼠标在产生鼠标事件时的 y 坐标。

代码案例

//MouseDown 控件上的 TextBox 事件,以便单击右鼠标按钮选择控件中的所有文本。
 void tbx01_MouseDown(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Right)
            {
                tbx01.Select(0, tbx01.Text.Length);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tbx01.ContextMenu = new ContextMenu();
            tbx01.MouseDown += new MouseEventHandler(tbx01_MouseDown);//委托,对控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求
        }

//响应鼠标的不同按键
private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                MessageBox.Show("鼠标已按下右键");
            }
            else if (e.Button == MouseButtons.Middle)
            {
                MessageBox.Show("鼠标已按下中键");
            }
            else if (e.Button == MouseButtons.Left)
            {
                MessageBox.Show("鼠标已按下左键");
            }
        }

在这里插入图片描述

ContextMenu 概述

表示使用特定于上下文的 Menu 来公开功能的元素。 通常,用户通过单击鼠标右键在用户界面 (UI) 中公开 ContextMenu。

演示效果

在这里插入图片描述

程序代码

private void btn_MouseDown(object sender, MouseEventArgs e)
        {
            ContextMenu btnmenu = new ContextMenu();
            btnmenu.MenuItems.Add("hello");
            btnmenu.MenuItems.Add("world");
            btnmenu.Show(btn,new Point(e.X, e.Y));
        }

MouseEventHandler

表示将处理窗体、控件或其他组件的 MouseDownMouseUpMouseMove 事件的方法。

开发过程中,特别是使用自定义控件时,常常需要对一个控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求。

void tbx01_MouseDown(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Right)
            {
                tbx01.Select(0, tbx01.Text.Length);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tbx01.ContextMenu = new ContextMenu();
            tbx01.MouseDown += new MouseEventHandler(tbx01_MouseDown);//委托,对控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求

创建 MouseEventHandler 委托时,需要标识将处理该事件的方法。 若要将事件与事件处理程序关联,请将该委托的一个实例添加到事件中。 除非移除了该委托,否则每当发生该事件时就会调用事件处理程序。

鼠标相关的事件大致有六种,分别是 :

“MouseHover”、“MouseLeave”、“MouseEnter”、“MouseMove”、“MouseDown"和"MouseUp”。

其中描述"MouseHover"、“MouseLeave”、“MouseEnter"事件的 Delegate是"EventHandler”

组件名称"."事件名称"+= new System.EventHandler("事件名称");
button1.MouseLeave += new Syetem.EvenHandler(button1_MLeave);

描述"MouseMove"、"MouseDown"和"MouseUp"三个事件的Delegate是"MouseEventHandler"来描述。

"组件名称"."事件名称"+= new System.Windows.Forms. MouseEventHandler("事件名称");
button1.MouseMove += new System.Windows.Forms.MouseEventHandler(button1_MMove);

句柄

是一个是用来标识对象或者项目的标识符,可以用来描述模块、应用程序实例、窗口、控制、位图、GDI对象、资源、文件等,值得注意的是句柄不能是常量

在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作

Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄 。

所以在C#中调用句柄时,会使用IntPtr数据类型。

从数据类型上来看,它只是一个16位的无符号整数。应用程序总是通过调用Windows API获得一个句柄,之后其他 Windows函数就可以使用该句柄,以引用和操作相应的内核对象。句柄可以像指针那样置空,那样句柄就没有任何意义,不代表任何内核对象

user32

详细介绍

Windows 管理函数,用于消息处理、计时器、菜单和通信。

1.ActiveKeyboardLayout 激活一个不同的键盘布局,该布局必须先由LoadKeyBoardLayout函数装载
2.AdjustWindowRect 根据希望的用户矩形大小来计算所需矩形窗口的大小,然后将该窗口矩形给
3.CreateWindow函数,以创建所需的窗口
4.AdjustWindowRectEx 根据希望的客户矩形大小来计算具有扩展式样的窗口所需的矩形窗口大小,然后将该窗口矩形传给CreateWindow函数,以创建所需的窗口
5.AnyPopup 确定屏幕上是否存在未被拥有的、可见的、顶层弹出式或重叠式窗口
6.AppendMenu 在给定菜单的尾不增加新项
7.ArrangeIconicWindows 在给定父窗口中安排最小化的子窗口
8.AttachThreadInput 将只线程的输入状态附加到其它线程上
9.BeginDeferWindowPos 创建多窗口位置的数据结构,并为该结构返回一个句柄
10.BeginPaint 为绘图准备一个窗口
11.BringWindowToTop 将给定窗口放到屏幕Z序顶部
12.BroadcastSystemMessage 发送一条消息给指定的接受器,这个接受器可被用于可安装驱动器、基于WINDOWS的网络驱动器、系统级设备驱动器或任何这些部件的组合
13.CallMsgFilter 将指定的消息和钩子代码传送给应用程序定义的回调函数,以便应用程序能够在对话框、消息框、菜单和滚动条进行内部处理或按ALT+TAB键激活另一窗口时,检查和控制消息流CallNextHookEx 将给定的钩子信息传递给当前钩子链的下一个钩子过程
14.CallWindowProc 将给定的消息传递给指定的窗口过程
15.CascadeWindows 级联指定父窗口的指定窗口或子窗口
16.ChangeClipBoardChain 从剪贴板查看程序链中去掉一个窗口
17.ChangeDisplaySettings 改变指定图形模式的显示环境
18.CharLower 将一个字符或字符串转换成小写
19.CharLowerBuff 将字符串缓冲区内指定数目的字符转换成小写
20.CharNext 返回指向字符串中某字符的下一个字符的指针
21.CharNextExA 检取字符串中下个字符的指针
22.CharPrev 返回字符串中某个字符的前一个字符的指针
23.CharPrevExA 检取字符串中某个字符的前一个字符的指针
24.CharToOem 将指定字符串转换到OEM定义的字符集中
25.CharToOemBuff 将字符串缓冲区中指定数目的字符转换成
26.OEM定义的字符集中
27.CharUpper 将一个字符后字符串转换成大写
28.CharUpperBuff 将字符缓冲区中指定数目的字符转换成大写
29.CheckDlgButton 通过对话框按扭改变一个选择标记
30.CheckMenuItem 通过菜单项改变一个选择标记
31.CheckMenuRadioItem 核对指定菜单项并作标记,同时去掉该组中其它菜单项的标记
32.CheckRadioButton 向组中给定圆按扭增加一个选择标志,并去掉该组中其它圆按扭的选择标志
33.ChildWindowFromPoint 确定包含给定点的子窗口
34.ChildWindowFromPointEx 确定包含给定点的子窗口
35.ClintToScreen 将给定的用户坐标转换成屏幕坐标
36.ClipCursor 将光标限定在屏幕上给定的矩形区域内
37.CloseClipBoard 关闭剪贴板,以允许其它窗口访问该剪贴板
38.CloseDesktop 关闭指定桌面对象的句柄
39.CloseWindow 最小化指定的窗口
40.CloseWindowStation 关闭一个打开的窗口站句柄
41.CopyAcceleratorTable 拷贝指定的加速键表
42.CopyIcon 拷贝一个图标
43.CopyImage 建立一个图象并拷贝指定图象的属性给它
44.CopyRect 拷贝一个矩形坐标
45.CountClipboardFormats 返回剪贴板当前不同数据格式的数目
46.CreateAcceleratorTable 创建一个加速键表
47.CreateCart 为系统插入符创建一个新形状,并且为给定窗口分配这个插入符的所有权
48.CreateCursor 用指定大小、位模式、热点创建一个光标
49.CreateDesktop 在和调用过程相关的窗口站上创建一个新桌面
50.CreateDialogIndirectParam 从内存对话框模板中创建一个无模式对话框
51.CreateDialotParam 从对话框模板资源中创建一个无模式对话框
52.CreateIcon 用指定大小、颜色和位模式创建一个图标
53.CreateIconFromResource 从描述图标的资源位中创建一个图标或光标
54.CreateIconFromResourceEx 从描述图标的资源位中创建一个图标或光标
55.CreateIconIndirect 根据ICONINFO数据结构创建一个图标或光标
56.CreateMDIWindow 创建一个多文档界面窗口
57.CreateMenu 创建一个菜单,然后用AppendMenu函数填充菜单项
58.CreatePopupMenu 创建一个弹出式窗口,然后用AppendMenu函数填充菜单项
59.CreateWindowEx 用指定方式创建一个窗口
60.CreateWindowstation 创建一个窗口站对象。一个窗口站是包含全局原子、剪贴板和桌面对象集的安全对象
61.DdeAbandonTransaction 放弃指定的异步事务处理,并释放与该事务处理相关的所有资源
62.DdeAccessData 提供对DDE对象中的数据的访问,当应用程序完成访问时,必须调用DdeUnaccessData函数
63.DdeAddData 把数据增加到给定的DDE对象中
64.DdeClientTransaction 在客户和服务器应用程序之间开始一个DDE数据处理
65.DdeCmpStringHandles 比较两个DDE字符串句柄的值,不区分大小写
66.DdeConnect 建立与支持所指定服务器应用程序服务名和主题名之间的会话,若服务器有多个,只选其一
67.DdeConnectList 建立与支持所指定的服务名和主题名相对应的所有服务器应用程序之间的会话
68.DdeCreateDataHandle 建立一个DDE对象,并用指定的数据填充对象
69.DdeCreateStringHandle 建立一个DDE字符串句柄DDE客户或服务器应用程序可把此句柄传递给其它DDE管理库函数
70.DdeDisconnect 结束一个DDE会话
71.DdeDisconnectList 撤消一个DDE会话列表并终止与该表有关的所有会话
72.DdeEnableCallback 允许或禁止指定的DDE会话
73.DdeFreeDataHandle 释放一个DDE对象,并删除与该对象有关的数据句柄
74.DdeFreeStringHandle 释放用DdeCreateStringHandle函数创建的字符串句柄
75.DdeGetData 从给定的DDE对象中拷贝数据到指定的缓冲区
76.DdeGetLastError 返回调用DDE管理库函数失败后设置的最新错误值
77.DdeImpersonateClient 模拟DDE会话中的DDE客户应用程序
78.DdeInitialize 利用DDE管理库函数注册应用程序
79.DdeKeepStringHandle 为给定的句柄增加用途数
80.DdeNameService 注册或去掉服务器所支持的服务者
81.DdePosAdvise 唤起一个服务以便系统把XTYP_ADVREQ事务处理发送给客户
82.DdeQueryConvInfo 检取有关DDE事务处理以及发生事务处理的会话的信息
83.DdeQueryNextServer 获得DDE会话列表中的下一个句柄
84.DdeQueryString 将与字符串句柄有关的文本拷贝到指定的缓冲区中
85.DdeReconnect 重建一个DDE会话
86.DdeSetqualityOfService 指定DDE会话所期望的服务质量
87.DdeSetUserHandle 把应用程序定义值与会话句柄或事务处理标识符联系起来
88.DdeUnaccessData 放弃访问一个DDE对象
89.DdeUninitilize 释放与调用应用程序有关的全部DDE管理库资源
90.DefDlgPorc 定义会话框类窗口过程的缺省消息处理
91.DeferwindowPos 修改给定的多窗口位置数据结构并返回修改后的结构句柄
92.DefFrameProc 定义多文档框架窗口的缺省消息处理
93.DefMDIChildProc 定义多文档子窗口的缺省消息处理
94.DefWindowProc 调用缺省的窗口过程对应用程序未处理的任何窗口消息提供缺省处理
95.DeleteMenu 从菜单中删除一个菜单项
96.DestroyAcceleratorTable 销毁一个加速键表
97.DestroyCaret 销毁插入符的当前形状
98.DestroyCursor 销毁由CreateCursor创建的光标
99.DestroyIcon 销毁由CreateIcon创建的图标
100.DestroyMenu 销毁指定的菜单
101.DestroyWindow 销毁指定的窗口
102.DialogBoxIndirectParam 从内存对话框模块中创建指定模式的对话框
103.DialogBoxParam 从对话框模板资源中创建一个模式对话框
104.DispatchMessage 传送一个消息给指定的窗口过程
105.DlgDirList 用匹配的路径或文件名填充指定的列表框
106.DlgDirListComboBox 用目录列表填充指定的组合框
107.DlgDirSelectComboBoxEx 用选择的列表填充指定的组合框
108.DlgDirSelectEx 从目录列表获取当前的选择
109.DragDetect 捕获鼠标并追踪它的移动,直到释放鼠标左键
110.DrawAnimatedRects 画一线框并激活它,以表明图标或最小/最大化窗口的打开
111.DrawCaption 画出给定窗口的标题
112.DrawEdge 画一个或多个矩形边界
113.DrawFocusRect 用给定的焦点样式画一矩形
114.DrawFrameControl 以指定类型和风格画一个框架控件
115.DrawIcon 在给定设备描述表的窗口中画一个图标
116.DrawIconEx 在给定设备描述表窗口的用户区画一个图标或光标,执行指定的光栅操作、并伸展或压缩图标或光标
117.DrawMenuBar 重新画一个给定窗口的菜单栏
118.DrawState 显示一个图形并运行形象效果,以表明一种状态
119.DrawText 在指定的矩形中画格式化文本
120.DrawTextEx 在指定的矩形中画格式文本
121.EmpytClipboard 清空剪贴板并释放剪贴板中数据句柄
122.EnableMenuItem 允许、禁止或变灰一个菜单
123.EnableScrollBar 允许或禁止流动的一个或两个箭头
124.EnableWindow 设置窗口的允许状态或控制接收鼠标或键盘输入
125.EndDeferWindowPos 修改一个或多个窗口的位置和大小
126.EndDialog 销毁指定模式的对话框,并使系统终止对此对话框的任何处理
127.EndPaint 结束在指定窗口中的绘画
128.EnumChildWindows 枚举一个父窗口中的所有子窗口
129.EnumClipboardFromats 枚举当前剪贴板中可用的数据格式
130.EnumDesktops 枚举指定调用进程窗口站里的全部桌面
131.EnumDesktopWindows 枚举一个桌面里的所有窗口
132.EnumDisplaySettings 获取有关显示设备某一图形模式的信息。通过反复调用该函数也可获取显示设备的所有模式的信息
133.EnumProps 枚举指定窗口的特征列表中的所有项
134.EnumPropsEx 枚举指定窗口特征列表中的所有项
135.EnumThreadWindows 枚举所有与指定线程有关的窗口
136.EnumWindows 枚举屏幕上所有顶层窗口
137.EnumWindowStations 枚举系统里所有的窗口站
138.EqualRect 确定两个矩形是否相等
139.ExcludeUpdateRgn 从剪贴板域内除去指定窗口内被更新的区域
140.ExitWindowsEx 重新启动或终止WINDOWS系统
141.FillRect 用指定画刷填充一个矩形
142.FindWindow 从类名或窗口名中返回一个相匹配的顶层窗口的句柄
143.FindWindowEx 检取和指定类名或窗口名相匹配的窗口的句柄
144.FlashWindow 使给定的窗口闪烁一次
145.FrameRect 用指定刷子围绕指定矩形画一个边框
146.FreeDDELParam 释放有一条被传递过来的DDE消息所指定的内存
147.GetActiveWindow 检取与调用此函数的线程有关的活动窗口句柄
148.GetAsyncKeyState 确定指定的键是处于UP还是DOWN状态
149.GetCapture 检取已捕获鼠标的窗口句柄
150.GetCaretBlinkTime 返回闪烁插入符象素所需的时间
151.GetCartePos 返回当前插入符的位置
152.GetClassInfo 检取指定窗口类的信息
153.GetClassInfoEx 检取指定窗口类的信息,包括和窗口类有关的最小图标的句柄
154.GetClassLong 检取指定窗口类的地址偏移量(32位)
155.GetClassName 检取指定窗口类的名称
156.GetClassWord 检取指定窗口类的地址偏移量(16位)
157.GetClientRect 返回用户区域的坐标
158.GetClipboardData 用指定格式从剪贴板中检取数据
159.GetClipboardFromatName 返回已注册的剪贴板格式名称
160.GetClipboardOwner 返回剪贴板当前拥有者的窗口句柄
161.GetClipboardViewer 返回剪贴板查看程序链中第一个窗口的句柄
162.GetClipCursor 返回限制光标的矩形区域的屏幕坐标
163.GetCursor 返回当前光标句柄
164.GetCursorPos 返回当前的光标位置
165.GetDC 返回指定窗口显示设备描述表的句柄
166.GetDCEx 返回指定窗口显示设备描述表的句柄
167.GetDesktopWindow 返回桌面窗口的句柄
168.GetDialogBaseUnits 返回创建对话框所用的基本单元
169.GetDlgCtrlID 返回指定控件的标识符
170.GetDlgItem 检取对话框中指定控件的句柄
171.GetDlgItemInt 将对话框中某控件的文本转换成整数值
172.GetDlgItamText 检取对话框中与某控件相关的标题或文本
173.GetDoubleClickTime 返回鼠标当前的双击时间
174.GetFocus 返回当前键盘焦点窗口的句柄
175.GetForegroundWindow 返回用户当前工作用的窗口句柄
176.GetIconInfo 检取给定图标或光标的信息
177.GetInputstate 确定当前线程的消息队列中是否有鼠标或键盘的消息
178.GetKBCodePage 提供早期WINDOWS版本的兼容性
179.GetKeyboardLayout 为一个指定线程检取活动键盘布局
180.GetKeyboardLayoutList 检取系统中当前输入地点集的所有活动键盘布局的句柄
181.GetKeyboardLayoutName 检取活动键盘布局的名称
182.GetKeyboardState 返回所有虚键的当前状态
183.GetKeyboardType 检取当前键盘的类型
184.GetKeyNameText 检取表示某键名称的字符串
185.GetKeyState 返回指定虚键是UP还是DOWN状态
186.GetLastActivePopup 确定哪个弹出窗口是最近活动的
187.GetMenu 返回指定窗口的菜单句柄
188.GetMenuCheck 返回缺省记号位图的尺寸
189.GetMenuContextHelpId 返回和指定菜单相关的帮助描述表的标识符
190.GetMenudefaultItem 确定指定菜单的缺省菜单项
191.GetMenuItemCount 返回给定菜单栏或弹出式菜单中的菜单项数
192.GetMenuItemID 返回指定菜单项的标识符
193.GetMenuItemInfo 返回有关菜单项的信息
194.GetmenuItemRect 返回指定菜单项的边界矩形
195.GetMenustate 返回与指定菜单项有关的菜单标志
196.GetMenustring 将指定菜单项的文本串拷贝到给定的缓冲区中
197.GetMessage 从指定线程的消息队列中检取一条消息
198.GetMessageExtraInfo 检取与一条消息有关的硬件消息
199.GetMessagePos 返回最后一条消息发生时光标所在的位置
200.GetMessageTime 返回从系统自动到最后一条消息创建所经历的时间
201.GetNextDlgGroupItem 返回对话框中位于给定控件之间或之后的控件句柄
202.GetNextDlgTabItem 返回具有WS_TABSTOP风格的位于给定控件之间或之后的控件的句柄
203.GetNextQueueWindow 按Z序返回位于给定窗口上一个或下一个窗口
204.GetOpenClipboardWindow 返回当前打开剪贴板的窗口句柄
205.GetParent 返回给定子窗口的父窗口
206.GetPriorityClipboardFormat 返回指定表中第一可用的剪贴板格式
207.GetProcessWindowStation 返回与调用进程有关的窗口站的句柄
208.GetProp 从给定的窗口属性表中返回一数据句柄
209.GetQueuestatus 确定调用线程消息的类型
210.GetScrollInfo 返回滚动条的参数,包括最小/最大滚动位置,页大小及拇指框的位置
211.GetScrollPos 返回当前滚动条的拇指框的位置
212.GetScrollRanges 返回给定滚动条当前最小和最大滚动框的位置
213.GetSubMenu 返回由指定菜单项激活的弹出式菜单句柄
214.GetsysColor 返回指定显示单元的当前颜色
215.GetsysColorBrush 检取相应于指定颜色索引的逻辑刷的句柄标识符
216.GetSystemMenu 允许应用程序访问SYSTEM菜单进行拷贝和修改
217.GetSystemMetrics 检取系统度量各种显示单元的宽度和高度
218.GetTabbedTextExtent 确定包含制表符的字符串的宽度和高度
219.GetThreadDesktop 返回与指定线程有关的桌面句柄
220.GetTopWindow 返回指定窗口顶层子窗口的句柄
221.GetUpdateRect 返回指定窗口包围更新区域矩形的宽和高
222.GetUpdateRgn 返回指定窗口包围更新区域
223.GetUserObjectInfomation 返回有关窗口站或桌面对象的信息
224.GetWindow 返回指定窗口的句柄
225.GetWindowContextHelpId 返回指定窗口的帮助描述表标识符
226.GetWindowDC 返回指定窗口是的设备描述表
227.GetWindowLong 返回指定窗口的附加窗口内存的地址(32位)
228.GetWindowPlacement 返回指定窗口的显示状态,以及被恢复、被最大化和最小化的位置
229.GetWindowRect 检取指定窗口限制矩形的尺寸
230.GetWindowRgn 获得指定窗口矩形区域的一个拷贝
231.GetWindowText 把指定窗口的标题栏文本拷贝到指定缓冲区中
232.GetWindowTextLength 返回指定窗口的标题栏文本的长度
233.GetWindowThreadProcessId 检取创建指定窗口的线程的标识符
234.GetWindowWord 返回指定窗口的附加窗口内存的地址(16位)
235.GrayString 在指定位置绘制灰色文本
236.HideCaret 从屏幕上删除插入符
237.HiliteMenuItem 改变顶层菜单的增亮菜单项
238.ImpersonateDdeCliebtWindow 使指定的DDE服务器应用程序能够模拟一个
239.DDE客户应用程序的安全性描述表,以便安全的保护服务器数据不被未授权的DDE客户使用
240.InflateRect 改变指定矩形的宽度和长度
241.InSendMessage 确定指定窗口过程是否正在处理
242.SendMessage函数送来的消息
243.InsertMenu 在指定的窗口中插入新的菜单栏
244.InsertMenuItem 在指定的菜单栏或弹出式窗口中插入新才菜单项
245.InterserRect 计算两个矩形的交集,得到新的目标矩形
246.InvalidateRect 将给定矩形添加到指定窗口的更新区域
247.InvalidateRgn 将给定区域添加到指定窗口的更新区域
248.InvertRect 转换窗口内指定的矩形区域
249.IsCharAlpha 确定指定字符是否为字母
250.IsCharAlphaNumeric 确定指定字符是字母还是数字
251.IsCharLower 确定指定字符是否为小写
252.IsCharUpper 确定指定字符是否为大写
253.IsChild 确定指定窗口是否为给定父窗口的子窗口
254.IsClipBoardFormatAvaliable 确定剪贴板是否包含有给定格式的有用数据
255.IsDialogMessage 确定一条消息是为给定对话框所期望的
256.IsDlgButtonChecked 确定按扭控制的状态
257.IsIconic 确定指定窗口是否极小化
258.IsMenu 确定一个句柄是否为菜单句柄
259.IsRectEmpty 确定一个矩形是否为空
260.IsWindow 确定指定窗口句柄是不是一个已有的窗口
261.IsWindowEnabled 确定指定窗口能否接受鼠标或键盘输入
262.IsWindowUnicode 确定给定窗口是不是一个本地的Unicode窗口
263.IsWindowVisible 确定窗口的可见性
264.IsZoomed 确定指定窗口是否为极大化
265.keybd_event 合成一个击键事件,以用于以后由系统生成一条WM_KEYUP或WM_KEYDOWN消息
266.KillTimer 撤消指定的计时器
267.LoadAccelerators 装入指定的加速键表
268.LoadBitmap 装入指定的位图资源
269.LoadCursor 装入指定的光标资源
270.LoadCursorFromFile 根据指定文件中数据创建一个光标
271.LoadIcon 装入指定的图标资源
272.LoadImage 装入一个图标、光标或位图
273.LoadKeyboardLayout 装入指定的键盘布局
274.LoadMenu 装入指定的菜单资源
275.LoadMenuIndirect 将指定的菜单模板装入内存
276.LoadString 装入指定的字符串资源
277.LockWindowUpdate 禁止或重新允许在指定的窗口上画图
278.
279.LookupIconIdFromDirectory 查找最适合当前显示设备的图标或光标数据
280.LookupIconIdFromDirectoryEx 查找最适合当前显示设备的图标或光标数据
281.MapDialogRect 将指定对话框单元转换为屏幕象素
282.MapVirtualKey 将一个虚键码翻译成扫描码或字符值或反之
283.MapVirtualKeyEx 将一个虚键码翻译成扫描码或字符值或反之
284.MapWindowPoints 将指定窗口的一组点转换到另一窗口坐标空间中
285.MenuItemFromPoint 选择指定点所在的菜单项
286.MessageBeep 放出波形声音
287.MessageBox 创建、显示并操作一个消息框
288.MessageBoxEx 创建、显示并操作一个消息框,并可用参数
289.指定预定义按扭采用的语言资源集合
290.MessageBoxIndirect 创建、显示并操作消息框
291.ModifyMenu 修改一个已存在的菜单项,包括内容,外观和特性
292.mouse_event 合成鼠标移动和按扭菜单事件
293.MoveWindow 改变指定窗口的位置和宽、高
294.MsgWaitForMultipleObjects 判断指定等待的条件是否满足,不满足则调用的线程进入有效等待状态
295.OemKeyScan 把OEM的ASCII码转换成OEM扫描码
296.OemToChar 把指定OEM字符串转换成ANSI字符串
297.OemToCharBuff 把OEM字符缓冲区中指定数目的字符转换成
298.ANSI字符
299.OffsetRect 把指定矩形移动给定的偏移量
300.OpenClipboard 打开剪贴板以供检查,并阻止其它应用程序修改其内容
301.OpenDesktop 返回一个存在桌面的句柄
302.OpenIcon 激活一个最小化窗口图标
303.OpenInputDesktop 返回接收用户输入的桌面的句柄
304.OpenWindowStation 返回一个存在窗口站的句柄
305.PackDDElParam 将DDE的参数值lParam封装到用来存放过程
306.之间共享的DDE数据的内部结构中
307.PaintDesktop 在指定的带桌面调色板和壁纸的设备描述表里填充裁剪区域
308.PeekMessage 检查应用程序的消息队列
309.PostMessage 在指定的窗口消息队列中放置一条消息
310.PostQuitMessage 通知WINDOWS有一个线程已发出终止请求
311.PostThreadMessage 在指定线程的消息队列中放置一条消息
312.PtInRect 确定指定的点是否在给定的矩形内
313.RedrawWindow 更新窗口客户区中给定的矩形或区域
314.RegisterClass 为以后调用CreatWindow函数注册一个窗口类
315.RegisterClassEx 为以后调用CreatWindow函数注册一个窗口类
316.RegisterClipboardFormat 注册一个新的剪贴板数据格式
317.RegisterHotKey 在当前线程定义一个热键
318.RegisterWindowMessage 定义一个新的窗口消息,该消息在整个系统范围内是唯一的
319.ReleaseCapture 释放当前线程窗口的鼠标捕获
320.ReleaseDC 释放指定的设备描述表
321.RemoveMenu 删除指定的菜单项或弹出式菜单
322.RemoveProp 从指定窗口特征表中删除一个入口
323.ReplyMessage 响应由SendMessage函数发送的消息,但不把控制权还给调用SendMessage函数的线程
324.ReuseDDElParam 允许一个应用程序重新使用一个被封装的
325.DDE的lParam参数
326.ScreenToClient 把一个屏幕指定的坐标点转换成客户坐标
327.ScrollDC 水平或垂直滚动一个由位组成的矩形
328.ScrollWindow 滚动指定窗口中的客户区内容
329.ScrollWindowEx 滚动指定窗口中的客户区内容
330.SendDlgItemMessage 把指定的消息发送给指定的对话框控件
331.SendMessage 把一消息发送给指定的多个窗口
332.SendMessageCallback 向给定的一个或多个窗口发送指定的消息,并将结果传送给回调函数
333.SendMessageTimeout 向给定的一个或多个窗口发送指定的消息,且在窗口过程处理完这条消息或指定限时过后才返回
334.SendNotifyMessage 向给定窗口发送指定的消息,且不等待窗口过程对消息的处理
335.SetActiveWindow 激活与调用该函数的线程相关的顶层窗口
336.SetCapture 向当前线程窗口设置鼠标捕获标记
337.SetCaretBlinkTime 设置插入符闪烁的速率
338.SetCaretPos 设置插入符的位置
339.SetClassLong 设置附加类内存的地址(32位)
340.SetClassWord 设置附加类内存的地址(16位)
341.SetClipboardData 用指定格式在剪贴板中放置数据
342.SetClipboardViewer 把指定窗口添加到剪贴板查看程序链中
343.SetCursor 设置光标的形状
344.SetCursorPos 把光标移到指定的屏幕坐标处
345.SetDebugErrorLevel 设置最低的错误层次,在该层次上,系统将产生调试事件并传递给调试程序
346.SetDlgItemInt 把对话框中给定控件的文本串设置为给定整数的字符串
347.SetDlgItemText 设置对话框中指定控件的标题或项目文本
348.SetDoubleClickTime 设置鼠标的双击时间
349.SetFocus 为指定的窗口设置键盘输入焦点
350.SetForegroundWindow 把创建给定窗口的线程放到前台并激活该窗口
351.SetKeyboardState 设置调用线程的键盘输入状态表
352.SetLastErrorEx 为调用线程设置最后一次的错误码错误类型
353.SetMenu 把一个新菜单赋予指定的窗口
354.SetMenuContextHelpId 使一个菜单与帮助描述表标识符相关联,该菜单的所有项共享这个标识符
355.SetMenuDefaultItem 使指定的位图与一个菜单项相关联
356.SetMenuItemBitmaps 把指定的位图与一个菜单项联系起来
357.SetMenuItemInfo 改变指定菜单项的信息
358.SetMessageExtraInfo 为当前线程设置附加消息信息
359.SetMessageQueue 创建一个新的消息队列
360.SetParent 改变指定子窗口的父窗口
361.SetProcessWindowStation 分配一个窗口站给调用进程,以便该进程能够访问窗口站里的对象,如桌面、剪贴板和全局原子等
362.SetProp 在指定的特征表中添加或改变一个入口
363.SetRect 设置指定矩形的宽和高
364.SetRectEmpty 创建一个空矩形
365.SetScrollInfo 设置滚动条的参数,包括最大/最小位置,页尺寸和拇指框位置
366.SetScrollPos 设置滚动条中滚动框的位置
367.SetScrollRange 设置滚动条最大或最小位置值
368.SetSysColors 为一个或多个元素设置系统颜色
369.SetSystemCursor 定制系统光标
370.SetThreadAffinityMask 设置指定线程所需的处理器数
371.SetThreadDesktop 分配一个桌面给调用线程
372.SetTimer 用指定的限时值创建一个定时器
373.SetUserObjectInformation 设置有关窗口站或桌面对象的信息
374.SetUserObjectSecurity 设置用户对象的安全特性
375.SetWindowContextHelpId 使一个帮助描述表标识符和一个指定窗口相关
376.SetWindowLong 修改给定窗口的一个属性,并在附加窗口内存的指定偏移处设置新值(32位)
377.SetWindowPlacement 设置窗口的显示状态及复原、最大化和最小化位置
378.SetWindowPos 设置窗口大小,位置及在屏幕上的Z次序
379.SetWindowRgn 设置窗口的窗口区域
380.SetWindowsHook 把应用程序定义的钩子函数装入到钩子链中
381.SetWindowsHookEx 把应用程序定义的钩子函数装入到钩子链中
382.SetWindowText 设置给定窗口的标题栏或控件的文字
383.SetWindowWord 在附加窗口内存的指定偏移处设置新值(16位)
384.ShowCaret 显示插入符
385.ShowCursor 显示或隐藏鼠标光标
386.ShowOwnedPopups 显示或隐藏给定窗口所拥有的全部弹出式窗口
387.ShowScrollBar 显示或隐藏滚动条
388.ShowWindow 设置窗口的可见性状态
389.ShowWindowAsync 设置由不同线程创建的窗口显示状态
390.SubtractRect 获取一个矩形减去另一矩形所得到的矩形的坐标
391.SwapMouseButton 交换或恢复鼠标左、右按扭的含义
392.SwitchDesktop 使一桌面可见并激活它,以便该桌面接受用户输入
393.SystemParametersInfo 查询或设置系统范围参数
394.TabbedTextOut 在一个指定位置用当前选择的字体写一个字符
395.TileWindows 贴瓦式排列指定窗口或其子窗口
396.ToAscii 把指定的虚键码和键盘状态翻译成相应的
397.WINDOWS字符
398.ToAsciiEx 把指定的虚键码和键盘状态翻译成相应的
399.WINDOWS字符
400.ToUnicode 把指定的虚键码和键盘状态翻译成相应的
401.Unicode字符
402.TrackPopupMenu 显示并跟踪弹出式菜单项的选择
403.TrackPopupMenuEx 在指定位置显示弹出式菜单,并跟踪弹出式菜单项的选择
404.TranslateAccelerator 处理菜单命令加速键
405.TranslateMDISysAccel 处理多文档加速键
406.TranslateMessage 把虚键消息翻译为字符消息
407.UnhookWindowsHook 从钩子链中删除一个钩子函数
408.UnhookWindowsHookEx 从钩子链中删除一个钩子函数
409.UnionRect 创建两个矩形的联合
410.UnloadKeyboardLayout 删除一个键盘布局
411.UnpackDDElParam 拆开从一条一公布的DDE消息中接收到的
412.DDElParam值
413.UnregisterClass 删除一个窗口类,释放该类申请的内存
414.UnRegisterHotKey 释放调用线程原先登记的一个热键
415.UpdateWindow 修正指定窗口中的客户区
416.ValidateRect 从修改区删除一个矩形
417.ValidateRgn 从修改区删除一个区域
418.VkKeyScan 把当前键盘的一个字符翻译为虚键码和转换状态
419.VkKeyScanEx 把当前键盘的一个字符翻译为虚键码和转换状态
420.WaitForInputIdle 等待新的用户输入或一直到限时已过
421.WaitMessage 当线程的消息队列中没有其它消息时,挂起该线程并交出控制权,直到该线程有新的消息到来时才返回
422.WindowFromDC 返回与指定显示设备描述表相联系的窗口句柄
423.WindowFromPoint 返回包含有指定点的窗口句柄
424.WinHelp 启动WINDOWS帮助文件Winhelp.exe
425.wsprintf 在一个缓冲区中格式化并存储一串字符和值

使用方法

使用DllImport类调用

		//获取当前鼠标下可视化控件的句柄
        [DllImport("user32.dll")]
        public static extern int WindowFromPoint(int xPoint, int yPoint);
        //获取指定句柄的父级句柄
        [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
        private static extern IntPtr GetParent(IntPtr hWnd);
        //获取屏幕的大小
        [DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
        private static extern int GetSystemMetrics(int mVal);

DllImportAttribute 类

命名空间:System.Runtime.InteropServices
程序集:System.Runtime.InteropServices.dll

指示由非托管动态链接库 (DLL) 公开为静态入口点的特性化方法。

使用方法
//引入命名空间
using System.Runtime.InteropServices;
//创建函数名称
[DllImport("demo.dll")]
public static extern bool OpenDemo();
//修饰符static和extern是必不可少的(extern外部修饰符,常与DllImport属性一起使用,用于支持在外部实现方法).最少要提供包含入口点的dll的名称
//DllImportAttribute属性用法
[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
   public DllImportAttribute(string dllName) {…}    //定位参数为dllName
   public CallingConvention CallingConvention;      //入口点调用约定
   public CharSet CharSet;                              //入口点采用的字符接
   public string EntryPoint;                //入口点名称
   public bool ExactSpelling;               //是否必须与指示的入口点拼写完全一致,默认false
   public bool PreserveSig;                 //方法的签名是被保留还是被转换
   public bool SetLastError;                //FindLastError方法的返回值保存在这里
   public string Value { get {…} }
}
参数说明

(1)DllImport只能放置在方法声明上。
(2)DllImport具有单个定位参数:指定包含被导入方法的 dll 名称的 dllName 参数。
(3)DllImport具有五个命名参数:
 a、CallingConvention 参数指示入口点的调用约定。如果未指定 CallingConvention,则使用默认值 CallingConvention.Winapi。
 b、CharSet 参数指示用在入口点中的字符集。如果未指定 CharSet,则使用默认值 CharSet.Auto。
 c、EntryPoint 参数给出 dll 中入口点的名称。如果未指定 EntryPoint,则使用方法本身的名称。
 d、ExactSpelling 参数指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配。如果未指定 ExactSpelling,则使用默认值 false。
 e、PreserveSig 参数指示方法的签名应当被保留还是被转换。当签名被转换时,它被转换为一个具有 HRESULT 返回值和该返回值的一个名为 retval 的附加输出参数的签名。如果未指定 PreserveSig,则使用默认值 true。
 f、SetLastError 参数指示方法是否保留 Win32"上一错误"。如果未指定 SetLastError,则使用默认值 false。
(4)它是一次性属性类。
(5)此外,用 DllImport 属性修饰的方法必须具有 extern 修饰符。

DLL文件

DLL文件是动态链接库,也叫程序集,是一个包含可由多个程序,同时使用的代码和数据的库。

程序集是在 .NET 公共语言运行库 (CLR) 控制之下运行的逻辑功能单元。程序集实际上是作为 .dll 文件或 .exe 文件存在的。

创建方法

在C#中创建类库,定义一个类,在类中定义方法,然后生成解决方案。

引用方法

解决方案中的【引用】→【添加引用】→【浏览】→【bin】→【Debug】→【选择拷贝过来的DLL】→【确认】

//引入命名空间
using 类库名;
//实例化类,调用方法
//案例,TestClass为引用的DLL名字
using TestClass;
//实例化DLL中的类(EchoNum),并调用类的方法(ReturnNum)
TestClass.EchoNum num23 = new TestClass.EchoNum();
int num = num23.ReturnNum(40);
MessageBox.Show(num.ToString());

托管代码与非托管代码

定义

托管代码

也叫中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各种服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。

源代码在运行时分为两个阶段:

  • 源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)
  • 托管代码编译为microsoft的平台专用语言

编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。


非托管代码

直接编译成目标计算机码,在公共语言运行库环境的外部,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。如需要内存管理等服务,必须显示调用操作系统的接口,通常调用Windows SDK所提供的API来实现内存管理。

当项目选择名字以MFC,ATL,Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

区别

  1. 托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。
  2. 托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
  3. 托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在C# Winform中实现文字滚动效果,可以使用Label控件和Timer控件。首先,创建一个Label控件用于显示滚动的文字,然后添加一个Timer控件用于控制滚动速度。在Timer的Tick事件中,通过改变Label控件的Left属性的值来实现文字的滚动效果。具体的实现步骤如下: 1. 创建一个Winform项目,命名为Ex01_31,窗体默认为Form1。 2. 在窗体上添加一个Label控件用于显示消息,添加一个Button控件用于控制消息的运动,添加一个Timer控件用于控制滚动速度。 3. 在代码中,编写以下主要程序代码: ```csharp private void timer1_Tick(object sender, EventArgs e) { label1.Left -= 2; if (label1.Right < 0) { label1.Left = this.Width; } } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; //开始滚动 } private void button2_Click(object sender, EventArgs e) { timer1.Enabled = false; //停止滚动 } ``` 这段代码中,timer1_Tick事件中的代码用于控制文字的滚动速度。每次Timer触发Tick事件时,将Label控件的Left属性减去2,实现文字向左滚动的效果。当Label控件的Right属性小于0时,将Label控件的Left属性设置为窗体的宽度,使文字重新回到初始位置。button1_Click事件用于启动滚动,button2_Click事件用于停止滚动。 这样,当单击【演示】按钮时,文字就会开始滚动。单击【暂停】按钮可以停止滚动。 参考资料: \[1\] 引用\[1\] \[2\] 引用\[2\] \[3\] 引用\[3\] #### 引用[.reference_title] - *1* *2* [C# winform-窗体中的滚动字幕【案例+源码】](https://blog.csdn.net/m0_65636467/article/details/127869709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [winform实现文字滚动](https://blog.csdn.net/qq_39569480/article/details/127571034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值