C#实现QQ窗体功能

2023-10-31

案例简述

通过C#使用类似QQ窗体的功能,当窗体放置到屏幕的边缘,可以将窗体隐藏,当鼠标再次放置到屏幕边缘时,窗体可再次显示。

预备知识导图

img

功能结构

由于本案例主要通过窗体和鼠标位置句柄的比对,以及判断窗体在屏幕的位置,进行窗体的移动和隐藏。窗体的隐藏通过时间控件循环。涉及的功能如下

  • 获取当前鼠标位置的句柄
  • 获取当前窗体的句柄
  • 比对鼠标位置所在控件的句柄和窗体句柄,进行窗体的移动
  • 判断当前窗体所在屏幕的位置以及比对鼠标位置和窗体的句柄是否一致,进行隐藏

关键代码

//利用C#中Cursor.Position属性和Point结构
Point CPoint;//定义鼠标的坐标
CPoint = new Point(Cursor.Position.X,Cursr.Position.Y);
/*
int a,b;
a= CPoint.X;//鼠标坐标的X值
b= CPoint.Y;//鼠标坐标的Y值
*/
//在创建获取鼠标下可视化控件句柄方法前,需要调用windows系统api函数user32.dll。
#region  API声明
//获取当前鼠标下可视化控件的句柄
[DllImport("user32.dll")]
public static extern int WindowFromPoint(int xPoint, int yPoint);
//获取指定句柄的父级句柄
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
//获取屏幕的大小
[DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
private static extern int GetSystemMetrics(int mVal);
#endregion

#region  获取当前鼠标下可视化控件的句柄
/// <summary>
/// 获取当前鼠标下可视化控件的句柄
/// </summary>
/// <param x="int">当前鼠标的X坐标</param>
/// <param y="int">当前鼠标的Y坐标</param>
public IntPtr FormNameAt(int x, int y)
{
    IntPtr Tem_hWnd;//设置存储句柄的变量
    Tem_Handle = (IntPtr)(WindowFromPoint(x, y));//获取当前鼠标下可视化控件的句柄
    Tem_hWnd = Tem_Handle;//记录原始句柄
    while (Tem_hWnd != ((IntPtr)0))//遍历该句柄的父级句柄
    {
        Tem_Handle = Tem_hWnd;//记录当前句柄
        Tem_hWnd = GetParent(Tem_hWnd);//获取父级句柄
    }
    return Tem_Handle;//返回最底层的父级句柄
}
#endregion

知识点分析

C#基础知识

IntPtr:表示一个带符号整数,其中位宽度与指针相同。即用来表示指针或句柄、它是一个平台特定类型,另外关于IntPtr(0)作用等同于IntPtr.Zero,在MSDN的介绍如下

此字段的值不等效于 null。 使用此字段可以有效地确定 的 IntPtr 实例是否已设置为非零值。

例如,假设变量 ip 是 的 IntPtr实例。 可以通过将它与构造函数返回的值进行比较来确定它是否已设置,例如:“ if ip != new IntPtr(0)… ”。 但是,调用构造函数来获取未初始化的指针效率低下。 最好对“” if ip != IntPtr.Zero… 或“”“ if !IntPtr.Zero.Equals(ip)… 进行编码。

Point:常用的方法为保存鼠标的坐标,MSDN介绍如下:

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

DIIImport:命名空间为System.Runtime.InteropServices,作用是提供非托管DLL导出的函数的必要调用信息,比如windows系统的API函数。在调用时,需要提供包含入口点的dll名称。如[DllImport(“user32.dll”)]。用 DllImport 属性修饰的方法必须具有 extern 修饰符

另外对于DIIImport有五个命名参数,详细描述如下:

命名参数名称 描述 说明
CallingConvention 参数指示入口点的调用约定。如果未指CallingConvention,则使用默认值 CallingConvention.Winapi
CharSet 用在入口点中的字符集。如果未指定 CharSet,则使用默认值 CharSet.Auto
EntryPoint 给出 dll 中入口点的名称。如果未指定 EntryPoint,则使用方法本身的名称
ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配。如果未指定 ExactSpelling,则使用默认值 false
PreserveSig 方法的签名应当被保留还是被转换。当签名被转换时,它被转换为一个具有 HRESULT返回值和该返回值的一个名为 retval 的附加输出参数的签名。如果未指定 PreserveSig,则使用默认值 true。
SetLastError 方法是否保留 Win32"上一错误"。如果未指定 SetLastError,则使用默认值 false。

Screen:表示单个系统上的一个或多个显示设备。本案例用到的地方为获取屏幕边界

this.Height=Screen.AllScreens[0].Bounds.Height;其他常用的方法是将软件中的多个窗体,在主屏幕运行,但是把各个窗体(坐标)移动到各个扩展屏幕位置。

Windows系统知识

句柄:以下摘自百度百科

用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量

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

在本案例中主要用于记录当前鼠标位置和窗体的标签。

**user32.dll:**以下摘自百度百科

user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。

在C#程序开发中,在基于windows系统开发运行时,需要调用windows系统相关应用程序,所以需要user32.dll接口内的方法实现相关功能,对应的也包括kernel32.dll。user32.dll接口的方法过多,这里不一一介绍。

控件和组件

**事件e:**本文暂不讨论事件的原理机制,只讨论控件触发的事件。其实在进行控件的事件触发时,会有两个参数

(object sender, EventArgs e)

sender是事件源,表示触发事件的那个组件,比如说你按下按钮,那么sender就是按钮
EventArgs是事件参数,比如说你用鼠标点击窗体,那么EventArgs是会包含点击的位置等等,它用来辅助你处理事件。

源程序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#实现QQ窗体功能 的相关文章

随机推荐

  • uniapp - App 超详细消息推送功能实现,从 0-1 实现官方 unipush 推送全步骤稳定性毋庸置疑(附带详细的可运行示例源码和注释,保证 100% 完美接入)苹果安卓手机

    效果图 网上的教程太乱用不了 无法改造成自己想要的效果 在uniapp中开发的app 安卓苹果 使用 unipush 官方推送 从0 1实现完整过程及功能开发 你可以直接复制示例源码 跟着教程一步步配置 注释详细 准备 消息
  • JS手动实现一个new操作符

    要手动实现一个 new 操作符 首先要知道 new 操作符都做了什么事 即构造函数的内部原理 1 创建一个新对象 2 链接到原型 将构造函数的 prototype 赋值给新对象的 proto 3 绑定this 构造函数中的this指向新对象
  • C语言libcurl库的使用

    C语言libcurl库的安装与使用 curl库的作用是访问http和HTTPS网站 HTTPS加密的网站 在linux和树莓派都可以 把curl 7 71 1 tar bz文件复制到linux的工作目录 home lth mkdir htt
  • 怎么获取别人服务器信息,【奇技淫巧】通过解密f5的cookie信息获得服务器真实内网IP...

    原标题 奇技淫巧 通过解密f5的cookie信息获得服务器真实内网IP 渗透测试过程中 经常会遇到目标服务器使用F5 LTM做负载均衡 如果能获取到目标服务器的真实IP地址 会给后续渗透带来一定便利 本文既是最近渗透遇到的一点点经验分享 F
  • E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/t

    sudo apt get remove libappstream3 转载于 https www cnblogs com steinven p 11141368 html
  • MYSQL实训七——存储过程、函数与触发器

    第1关 创建存储过程 任务描述 本关任务 创建存储过程 pro findname 对学生姓名进行模糊查找 输入任一字输出姓名中含有该字的全部学生 相关知识 为了完成本关任务 你需要掌握 1 存储过程的定义 2 存储过程的创建和查询 3 存储
  • 游标的使用——mysql

    CREATE DEFINER root PROCEDURE split category all BEGIN declare categ varchar 10 套餐列 declare str varchar 10 declare num i
  • 因为知道了这64个实用网站,初入职场我就成为了别人眼中的大神!

    一 设计导航 新媒体设计 产品经理设计 CND设计 懒设计 创客贴 二 在线工具 ARKIE作图 GitMind Removing 神奇海螺 一个工具箱 在线PS 视频压缩 三 云盘文档 小米云盘 坚果云 有道云协作 腾讯文档 石墨文档 四
  • OpenWrt 软路由解析公网IPV6域名访问家庭NAS的问题答疑

    1 非要使用 Padavan 或者 OpenWrt固件的软路由才能IPV6公网访问吗 答 这个并不是这样的 一般家用路由器都无法放行防火墙规则 这种情况当然无法实现IPV6公网访问 但是少部分路由器是可以的 只要有防火墙设置功能基本都可以
  • Basic Level 1022 D进制的A+B (20分)

    题目 输入两个非负10进制整数 A A A和 B 2 30
  • define( )和defined( )函数的区别

    PHP中define 函数用来定义一个常量 而defined 函数用来检验常量是否存在 存在则返回true 否则返回false
  • C语言基础入门详解一

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 初识C语言 include 相当于java的import stdio全称 standard inpu
  • Python3 IDLE打不开,点击之后没反应

    python 2 IDLE打不开见python2 IDLE启动失败 电脑同时装了python2和python3 python2IDLE能打开 python3打不开 出现这种情况多半是环境变量配置有问题 直接打开IDLE看不到报错 可在命令行
  • 我的Github开源项目,从0到20000 Star!

    最近 我在Github上面开源的项目mall已经突破了20000 Star 这个项目是2018年3月份开始开发的 耗时9个月 发布了第一个版本 一直维护至今 回想起来 还是有诸多感慨的 下面我就谈谈我的项目发展的整个历程 项目发展历程 为什
  • jpg图片转pdf都有哪些工具?分享最简单的方法

    在互联网时代 JPG图片在我们的日常生活中变得越来越普遍 虽然在网上传输图片非常方便 但有时候我们需要将图片打印出来 这时候直接打印图片可能会导致失真 而且图片的大小和样式也不容易确定 将JPG图片转换成PDF格式 然后再打印 可以方便地解
  • Qt打包生成可执行程序

    一 为什么QT要打包和部署 因为我们要把写好的程序发给用户来用 我们写好的源码也不是随便给别人的 二 QT如何打包和部署 1 我们把工厂切换到release模式 然后编译 release模式 基本没有调试信息 debug模式 有很多调试信息
  • STM32学习:通过DMA读取ADC规则通道多通道转换数据

    1 STM32的DMA简介 直接存储器存取 DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无须CPU干预 数据可以通过DMA快速地移动 这就节省了CPU的资源来做其他操作 两个DMA控制器有12个通道 DMA1有7
  • MATLAB基本运算

    算术运算 1 基本运算符 加 减 乘 右除 左除 乘方 MATLAB的算术运算是在矩阵意义下进行的 单个数据的算术运算只是矩阵运算的一种特例 加减运算 若两矩阵同型 则运算时两矩阵的相应元素相加减 若两矩阵不同型 则MATLAB将给出错误信
  • 《科研伦理与学术规范》期末考试答案2023

    1 单选 2 分 关于科研伦理描述不正确的说法是 A 规范则未必均是在道德层面上具有调整性 B 伦理学已经从传统的以人为中心走向现代的以行为为中心 C 现代伦理学主要关注以行为 准则 规范 义务 D 所有的规范的评判都涉及到 善恶正邪 的价
  • C#实现QQ窗体功能

    C 实现QQ窗体功能 案例简述 预备知识导图 功能结构 知识点分析 C 基础知识 Windows系统知识 控件和组件 案例简述 通过C 使用类似QQ窗体的功能 当窗体放置到屏幕的边缘 可以将窗体隐藏 当鼠标再次放置到屏幕边缘时 窗体可再次显