文档章节

c# 外部方法的学习

我只是一只小小鸟
 我只是一只小小鸟
发布于 2015/04/24 13:53
字数 1381
阅读 19
收藏 0

在讲解如何实现窗口的抖动上,先要了解外部方法的使用。对于一个外部方法的实现过程,具体步骤如下:

1.需要添加引用

using System.Runtime.InteropServices;//提供了各类对com组件的互操作(便于外部调用系统dll文件)

2.声明和实现的连接[DllImport("kernel32",SetLastError=true)]

[DllImport("user32.dll")]

3.声明外部方法

 private static extern IntPtr GetForegroundWindow();//intptr类型称为“平台特定的整数类型”用于本机资源,如窗口句柄

                                                           //功能:获取当前活动窗体

4.对外部方法的操作

  intptr = GetForegroundWindow();//获取当前窗体的句柄

举一个窗体抖动的实例来了解外部方法的具体引用

为了实现窗体抖动,我们需要引用三个外部方法来获取当前窗体的一系列参数。

  1. 实现获取当前窗体的功能的外部函数GetForegroundWinddow()

  2. private static extern IntPtr GetForegroundWindow();

函数功能:获取一个前台窗口的句柄(窗口与用户当前的工作)。

返回值:返回值是一个前台窗口的句柄,在某些情况下,如果一个窗口失去激活时,前台窗口可以是null。

 private IntPtr intptr;//句柄变量
intptr =  GetForegroundWindow();//获取当前窗体的句柄

第二个外部函数:MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);//调整目标窗体的位置和尺寸

函数功能:函数功能:改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.对于Owned窗口,位置和大小取决于屏幕左上角.

函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );

hWnd指定了窗口的句柄

x指定了CWnd的左边的新位置。

y指定了CWnd的顶部的新位置。

nWidth指定了CWnd的新宽度。

nHeight指定了CWnd的新高度。

bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。


窗体的移动(代码如下)

 [DllImport("user32.dll")]
 public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);//调整目标窗体的位置和尺寸
  MoveWindow(intptr, rect.Left - intZ, rect.Top - intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);//调整获取的窗体位置和尺寸

第三个外部函数:GetWindowRect(IntPtr hWnd,out RECT lpRect);//获取窗体相对屏幕的位置

函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。

函数原型:BOOL GetWindowRect(HWND hWnd,LPRECT lpRect);

hWnd:窗口句柄

lpRect:指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标。

具体实现:

 GetWindowRect(intptr, out rect);//获取该窗体的位置和尺寸,传给rect

其实实现窗体的抖动,原理很简单,就是通过外部函数,来获取当前的窗体的句柄,以及尺寸,然后通过改变他的尺寸和位置来获取新的位置和大小。来实现抖动的。

具体实现如下:

 [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();//intptr类型称为“平台特定的整数类型”用于本机资源,如窗口句柄
                                                           //功能:获取当前活动窗体     
        [DllImport("user32.dll")]
        public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);//调整目标窗体的位置和尺寸
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]//【疑问】起什么作用呢
        public static extern bool GetWindowRect(IntPtr hWnd,out RECT lpRect);//获取窗体相对屏幕的位置
        [StructLayout(LayoutKind.Sequential)]//指定结构体按顺序布局。
        public struct RECT//结构体类型RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner             
            public int Bottom;      // y position of lower-right corner         
        }
        private IntPtr intptr;//句柄变量
        private void Form2_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = 100;
            timer1.Start();
            button1_Click(sender, e);//【疑问】这样把加载事件里面的参数传入到按钮事件里面有什么作用呢??
            //button1_Click(this, e);//这样写也是可以的
        }
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Tick += (sender1, e1) =>
            {
                findWindows();//委托这个方法去寻找窗体
            };
        }
        private void findWindows()
        {
            RECT rect = new RECT();
            Random rd = new Random();
            int intZ = rd.Next(10,20);
            intptr = GetForegroundWindow();//获取当前窗体的句柄
            GetWindowRect(intptr, out rect);//获取该窗体的位置和尺寸,传给rect
            MoveWindow(intptr, rect.Left - intZ, rect.Top - intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);//调整获取的窗体位置和尺寸
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left, rect.Top - intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left + intZ, rect.Top + intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left+intZ, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left + intZ, rect.Top + intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left, rect.Top + intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left-intZ, rect.Top + intZ, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left - intZ, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
            Thread.Sleep(intZ);
            MoveWindow(intptr, rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
        }

© 著作权归作者所有

我只是一只小小鸟
粉丝 14
博文 102
码字总数 53116
作品 1
荆州
程序员
私信 提问
[C#学习笔记1]用csc.exe和记事本写一个C#应用程序

csc.exe是C#的命令行编译器(CSharpCompiler),可以编译C#源程序成可执行程序。它与Visual Studio等IDE(Integrated Development Environment,集成开发环境)的区别是,csc.exe只是将用C#语...

wangmengdx
2018/10/05
0
0
第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的

基类中的修饰符,其实就是C#里的那几种修饰符,public ,proteced,internal,privat这四种基础类型,当然也还一个组合类型internal protected,它们都是C#里最基础的东西,今天觉得有必要再说一...

mcy247
2017/12/04
0
0
C#中public与private与static

现在静下心来想要重新细致的过一遍C#,因为自己做C#没有底气,, 闲话少说 先来一句话 public(共有的) 声明的方法和属性,可以被外部调用. private(私有的) 声明的方法和属性,只能在本类中被调用...

杨奉武
2016/09/12
0
0
objective-c优雅的语法

对初学者来说,objective-c存在了很多令人费解的写法,实际上他们是非常优雅的。 程序员写的最多的就是函数以及调用自己写的或者别人写的函数。本文就从函数的角度来看下objective-c的优雅之...

王二狗子11
2018/01/01
0
0
MSIL学习------从HelloWorld开始

1.有没有必要学习IL   前段时间突然想搞搞IL语言,于是在博客园中找到了包建强前辈关于IL的文章学习,并且在包前辈博客里看到了09年他与赵劼前辈关于是否有必要学习IL语言的争论,作为一个...

莫问今朝乄
2018/07/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
22分钟前
3
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部