一、NuGet安装框架
修改代码
效果:
结果:
TopLevel与TopMost属性
cs
frm.TopLevel = false; //Form.TopLevel 获取或设置一个值,该值指示是否将窗体显示为顶级窗口。
frm.TopMost = false; //Form.TopMost 获取或设置一个值,指示该窗体是否应显示为最顶层窗体。 TopMost是级别更高的属性
二、Marshal
三、IntPtr
intPtr类是intPointer的缩写 。C#中用来取代指针,也可以说对指针进行封装 。指向非托管内存。它也不常用,因为C#项目中指针都被弃用了,那指针的封装------句柄,自然也被弃用了
IntPtr类型对多线程操作是安 I****ntPtr其实就是 HANDLE,无类型的指针。无类型的指针不能直接使用,需要传给接受它的函数。
cpp
IntPtr a = new IntPtr(2121);
int类型与IntPtr类型之间的转换
cpp
int _value1 = 10;
int _value2 = 20;
// AllocHGlobal 通过使用指定的字节数从进程的非托管中分配内存
IntPtr _ptr1 = Marshal.AllocHGlobal(sizeof(int));
IntPtr _ptr2= Marshal.AllocHGlobal(sizeof(int));
// 将32位有符号整数写入非托管内存
Marshal.WriteInt32(_ptr1, _value1);
Marshal.WriteInt32(_ptr2, _value2);
int _nv1=Marshal.ReadInt32(_ptr1);
int _nv2=Marshal.ReadInt32(_ptr2);
Marshal.FreeHGlobal(_ptr1); // 释放非托管内存中
Marshal.FreeHGlobal(_ptr2);
Console.WriteLine();
string类型与IntPtr之间的转换
cpp
string _str = "aa";
IntPtr _strPtr = Marshal.StringToHGlobalAnsi(_str);
// 将非托管ANSI 字符串复制托管
string _s = Marshal.PtrToStringAnsi(_strPtr);
Marshal.FreeHGlobal(_strPtr);
结构体与IntPtr之间的转换
cs
// 结构体
stuInfo _stu = new stuInfo()
{
_name = "sam",
_gender = "male",
_age = 23,
_hight=34,
};
// 拿到大小
int _size=Marshal.SizeOf(_stu);
IntPtr _p1=Marshal.AllocHGlobal(_size);
// 这一步很重要
Marshal.StructureToPtr(_stu,_p1,true);
stuInfo _stu2 = (stuInfo)Marshal.PtrToStructure(_p1,typeof(stuInfo));
Console.WriteLine(_stu2._name);
Console.WriteLine(_stu2._gender);
Console.WriteLine(_stu2._age);
Console.WriteLine(_stu2._hight);
获得数组的指针
cs
int[] _ary = new int[] { 1, 2, 3 };
IntPtr inp = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 0);
IntPtr inp1 = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 1);
IntPtr inp2 = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 2);
//内存地址以字节为单位,第一个元素地址为:n,第二个为:n+数据类型的字节数。int32是4个字节,那么元素相邻址之间差4
//每次运行结果的内存地址都不一样!!!但地址却都相差4【系统随机分配内存】
Console.WriteLine(inp.ToString());//输出的就是一串数字,就是内存地址。输出结果:n
Console.WriteLine(inp1.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+4
Console.WriteLine(inp2.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+8
获取某个变量的指针
unsafe
这里就要用到C#中的指针,用unsafe {}关键字,并设置:项目属性------>生成------>勾选"允许不安全代码"