C#模拟实现QQ窗体功能

目录
  • 案例简述
  • 预备知识导图
  • 功能结构
  • 知识点分析
    • C#基础知识
    • Windows系统知识
    • 控件和组件

案例简述

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

预备知识导图

功能结构

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

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

关键代码

//利用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是会包含点击的位置等等,它用来辅助你处理事件。

到此这篇关于C#模拟实现QQ窗体功能的文章就介绍到这了,更多相关C# QQ窗体内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#实现QQ聊天窗口

    本文实例为大家分享了C#实现QQ聊天窗口的具体代码,供大家参考,具体内容如下 分析 需要两个TextBox,一个用于显示消息,一个用于编辑消息 需要四个按钮,分别控制关闭程序,清空正在编辑的消息,发送消息,抖动 原理 1.在TextBox2中编辑消息并发送,在TextBox1中显示所发送的消息的同时使TextBox2中的消息清空2.发送的第一条消息TextBox1先保存并显示,发送第二条消息时将TextBox1事先的消息先打印出来接着显示第二条消息3.抖动原理:使窗口的left以及top发生变化

  • C#实现QQ窗口抖动效果

    本文实例为大家分享了C#实现QQ窗口抖动效果的具体代码,供大家参考,具体内容如下 实现界面: 1. 两个textbook和两个Button 2. NotifyIcon控件是实现托盘 实现代码: private void Form1_Load(object sender, EventArgs e) { this.Text = "聊天窗口"; button1.Text = "抖动"; button2.Text = "发送"; this.AutoSiz

  • C#实现简化QQ聊天窗口

    本文实例为大家分享了C#实现简化QQ聊天窗口的具体代码,供大家参考,具体内容如下 如图样式,详细步骤如下 整个窗体设置 private void Form1_Load(object sender, EventArgs e)         {             this.BackColor = Color.Chocolate;//设置窗体背景颜色             this.Text = "与张某正在聊天...";//设置窗体文本内容             this.Si

  • C#仿QQ聊天窗口

    本文实例为大家分享了C#实现QQ聊天窗口的具体代码,供大家参考,具体内容如下 效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows

  • C#模拟实现QQ窗体功能

    目录 案例简述 预备知识导图 功能结构 知识点分析 C#基础知识 Windows系统知识 控件和组件 案例简述 通过C#使用类似QQ窗体的功能,当窗体放置到屏幕的边缘,可以将窗体隐藏,当鼠标再次放置到屏幕边缘时,窗体可再次显示. 预备知识导图 功能结构 由于本案例主要通过窗体和鼠标位置句柄的比对,以及判断窗体在屏幕的位置,进行窗体的移动和隐藏.窗体的隐藏通过时间控件循环.涉及的功能如下 获取当前鼠标位置的句柄 获取当前窗体的句柄 比对鼠标位置所在控件的句柄和窗体句柄,进行窗体的移动 判断当前窗体

  • JavaGUI模仿QQ聊天功能完整版

    本文实例为大家分享了JavaGUI模仿QQ聊天功能完整代码,供大家参考,具体内容如下 ClientForm代码: package GUISocket.chat.Client; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.EventQueue; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextFie

  • JS模拟按钮点击功能的方法

    本文实例讲述了JS模拟按钮点击功能的方法.分享给大家供大家参考,具体如下: <html> <head> <title>usually function</title> </head> <script> function load(){ //下面两种方法效果是一样的 document.getElementById("target").onclick(); document.getElementById("t

  • jQuery实现的模拟弹出窗口功能示例

    本文实例讲述了jQuery实现的模拟弹出窗口功能.分享给大家供大家参考,具体如下: //初始化文档 $(document).ready(); //----------------弹出DIV仿模态窗口开始---------------- var divW; //DIV宽度 var divH; //DIV高度 var clientH; //浏览器高度 var clientW; //浏览器宽度 var divTitle; //DIV标题 var pageUrl; //DIV中加载的页面 var div

  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    其中包含两个jsp文件,分别为login.jsp和index.jsp 代码如下: login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

  • Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录

    对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现: 1 .在用户登录时,把用户添加到一个ArrayList中 2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录 3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况 ① 使用注销按钮正常退出 ② 点击浏览器关闭按钮或者用Alt+F4退出,可以用JavaScript捕捉该页面关闭事件, 执行一段Java方法删除ArrayList中的用户 ③ 非正常退出,比如

  • Android模拟强制下线通知功能实例代码

    package com.itheima74.broadcastbestpractice; import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; import android.support.v4.content.LocalBroadcastManager; import android.view.View; /** * 模拟强制下线通知 * 1.登录成功后10秒发送一条本地自

  • Python3实现发送QQ邮件功能(附件)

    本文实例为大家分享了Python3实现发送QQ邮件功能:附件,供大家参考,具体内容如下 可以成功发送邮件附件,但是邮件主要内容无法发送,有空再去找找原因 import smtplib from email.mime.text import MIMEText from email.utils import formataddr from email.header import Header my_sender = 'xxxx@qq.com' # 发件人邮箱账号 my_pass = 'xxxxx'

  • Python3实现发送QQ邮件功能(文本)

    本文为大家分享了Python3实现发送QQ邮件功能:文本,供大家参考,具体内容如下 注意:使用前需要到qq中设置开启POP3 和IMAP服务和设置第三方授权码 然后在下面打x那里填入相关信息即可 import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='xxxx@qq.com' # 发件人邮箱账号 my_pass = 'xxxxxxx' # 发件人邮箱密码(当

  • express+mockjs实现模拟后台数据发送功能

    前言: 大多数时候,前端会和后端同时进行开发,即在我们开发完页面的时候,很可能还不能立马进入联调阶段,这个时候,为了保证我们接口的有效性和代码的功能完整,我们可能需要模拟数据. 模拟数据方法 1.通过js变量模拟后台数据 优点:不需要服务器 缺点:需要造很多变量,同时还要将变量在我们的有效代码中使用,最后还得删除 2.通过ajax请求json文件 优点:只需要配置路径,就可以访问,进入联调阶段不用修改大量的js代码 缺点:ajax存在跨域问题,通常无法请求本地文件,即使火狐也存在不能访问不同文件

随机推荐