日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#模擬實現QQ窗體功能_C#教程

作者:yue008 ? 更新時間: 2023-02-01 編程語言

案例簡述

通過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是會包含點擊的位置等等,它用來輔助你處理事件。

原文鏈接:https://blog.csdn.net/yue008/article/details/128433924

欄目分類
最近更新