最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#模擬實(shí)現(xiàn)QQ窗體功能

 更新時(shí)間:2022年12月26日 10:46:15   作者:yue008  
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C#實(shí)現(xiàn)類(lèi)似QQ窗體的功能,當(dāng)窗體放置到屏幕的邊緣,可以將窗體隱藏,當(dāng)鼠標(biāo)再次放置到屏幕邊緣時(shí),窗體可再次顯示,需要的可以參考一下

案例簡(jiǎn)述

通過(guò)C#使用類(lèi)似QQ窗體的功能,當(dāng)窗體放置到屏幕的邊緣,可以將窗體隱藏,當(dāng)鼠標(biāo)再次放置到屏幕邊緣時(shí),窗體可再次顯示。

預(yù)備知識(shí)導(dǎo)圖

功能結(jié)構(gòu)

由于本案例主要通過(guò)窗體和鼠標(biāo)位置句柄的比對(duì),以及判斷窗體在屏幕的位置,進(jìn)行窗體的移動(dòng)和隱藏。窗體的隱藏通過(guò)時(shí)間控件循環(huán)。涉及的功能如下

  • 獲取當(dāng)前鼠標(biāo)位置的句柄
  • 獲取當(dāng)前窗體的句柄
  • 比對(duì)鼠標(biāo)位置所在控件的句柄和窗體句柄,進(jìn)行窗體的移動(dòng)
  • 判斷當(dāng)前窗體所在屏幕的位置以及比對(duì)鼠標(biāo)位置和窗體的句柄是否一致,進(jìn)行隱藏

關(guān)鍵代碼

//利用C#中Cursor.Position屬性和Point結(jié)構(gòu)
Point CPoint;//定義鼠標(biāo)的坐標(biāo)
CPoint = new Point(Cursor.Position.X,Cursr.Position.Y);
/*
int a,b;
a= CPoint.X;//鼠標(biāo)坐標(biāo)的X值
b= CPoint.Y;//鼠標(biāo)坐標(biāo)的Y值
*/
//在創(chuàng)建獲取鼠標(biāo)下可視化控件句柄方法前,需要調(diào)用windows系統(tǒng)api函數(shù)user32.dll。
#region  API聲明
//獲取當(dāng)前鼠標(biāo)下可視化控件的句柄
[DllImport("user32.dll")]
public static extern int WindowFromPoint(int xPoint, int yPoint);
//獲取指定句柄的父級(jí)句柄
[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  獲取當(dāng)前鼠標(biāo)下可視化控件的句柄
/// <summary>
/// 獲取當(dāng)前鼠標(biāo)下可視化控件的句柄
/// </summary>
/// <param x="int">當(dāng)前鼠標(biāo)的X坐標(biāo)</param>
/// <param y="int">當(dāng)前鼠標(biāo)的Y坐標(biāo)</param>
public IntPtr FormNameAt(int x, int y)
{
    IntPtr Tem_hWnd;//設(shè)置存儲(chǔ)句柄的變量
    Tem_Handle = (IntPtr)(WindowFromPoint(x, y));//獲取當(dāng)前鼠標(biāo)下可視化控件的句柄
    Tem_hWnd = Tem_Handle;//記錄原始句柄
    while (Tem_hWnd != ((IntPtr)0))//遍歷該句柄的父級(jí)句柄
    {
        Tem_Handle = Tem_hWnd;//記錄當(dāng)前句柄
        Tem_hWnd = GetParent(Tem_hWnd);//獲取父級(jí)句柄
    }
    return Tem_Handle;//返回最底層的父級(jí)句柄
}
#endregion

知識(shí)點(diǎn)分析

C#基礎(chǔ)知識(shí)

IntPtr:表示一個(gè)帶符號(hào)整數(shù),其中位寬度與指針相同。即用來(lái)表示指針或句柄、它是一個(gè)平臺(tái)特定類(lèi)型,另外關(guān)于IntPtr(0)作用等同于IntPtr.Zero,在MSDN的介紹如下

此字段的值不等效于 null。 使用此字段可以有效地確定 的 IntPtr 實(shí)例是否已設(shè)置為非零值。

例如,假設(shè)變量 ip 是 的 IntPtr實(shí)例。 可以通過(guò)將它與構(gòu)造函數(shù)返回的值進(jìn)行比較來(lái)確定它是否已設(shè)置,例如:“ if ip != new IntPtr(0)… ”。 但是,調(diào)用構(gòu)造函數(shù)來(lái)獲取未初始化的指針效率低下。 最好對(duì)“” if ip != IntPtr.Zero… 或“”“ if !IntPtr.Zero.Equals(ip)… 進(jìn)行編碼。

Point:常用的方法為保存鼠標(biāo)的坐標(biāo),MSDN介紹如下:

提供有序的 x 坐標(biāo)和 y 坐標(biāo)整數(shù)對(duì),該坐標(biāo)對(duì)在二維平面中定義一個(gè)點(diǎn)。

DIIImport:命名空間為System.Runtime.InteropServices,作用是提供非托管DLL導(dǎo)出的函數(shù)的必要調(diào)用信息,比如windows系統(tǒng)的API函數(shù)。在調(diào)用時(shí),需要提供包含入口點(diǎn)的dll名稱(chēng)。如[DllImport(“user32.dll”)]。用 DllImport 屬性修飾的方法必須具有 extern 修飾符

另外對(duì)于DIIImport有五個(gè)命名參數(shù),詳細(xì)描述如下:

命名參數(shù)名稱(chēng)描述說(shuō)明
CallingConvention參數(shù)指示入口點(diǎn)的調(diào)用約定。如果未指CallingConvention,則使用默認(rèn)值CallingConvention.Winapi
CharSet用在入口點(diǎn)中的字符集。如果未指定 CharSet,則使用默認(rèn)值CharSet.Auto
EntryPoint給出 dll 中入口點(diǎn)的名稱(chēng)。如果未指定 EntryPoint,則使用方法本身的名稱(chēng)
ExactSpelling指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫(xiě)完全匹配。如果未指定 ExactSpelling,則使用默認(rèn)值 false
PreserveSig方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換。當(dāng)簽名被轉(zhuǎn)換時(shí),它被轉(zhuǎn)換為一個(gè)具有 HRESULT返回值和該返回值的一個(gè)名為 retval 的附加輸出參數(shù)的簽名。如果未指定 PreserveSig,則使用默認(rèn)值 true。
SetLastError方法是否保留 Win32"上一錯(cuò)誤"。如果未指定 SetLastError,則使用默認(rèn)值 false。

Screen:表示單個(gè)系統(tǒng)上的一個(gè)或多個(gè)顯示設(shè)備。本案例用到的地方為獲取屏幕邊界

this.Height=Screen.AllScreens[0].Bounds.Height;其他常用的方法是將軟件中的多個(gè)窗體,在主屏幕運(yùn)行,但是把各個(gè)窗體(坐標(biāo))移動(dòng)到各個(gè)擴(kuò)展屏幕位置。

Windows系統(tǒng)知識(shí)

句柄:以下摘自百度百科

用來(lái)標(biāo)識(shí)對(duì)象或者項(xiàng)目的標(biāo)識(shí)符,可以用來(lái)描述窗體、文件等,值得注意的是句柄不能是常量

Windows之所以要設(shè)立句柄,根本上源于內(nèi)存管理機(jī)制的問(wèn)題,即虛擬地址。簡(jiǎn)而言之?dāng)?shù)據(jù)的地址需要變動(dòng),變動(dòng)以后就需要有人來(lái)記錄、管理變動(dòng),因此系統(tǒng)用句柄來(lái)記載數(shù)據(jù)地址的變更。在程序設(shè)計(jì)中,句柄是一種特殊的智能指針,當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄

在本案例中主要用于記錄當(dāng)前鼠標(biāo)位置和窗體的標(biāo)簽。

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

user32.dll是Windows用戶(hù)界面相關(guān)應(yīng)用程序接口,用于包括Windows處理,基本用戶(hù)界面等特性,如創(chuàng)建窗口和發(fā)送消息。

在C#程序開(kāi)發(fā)中,在基于windows系統(tǒng)開(kāi)發(fā)運(yùn)行時(shí),需要調(diào)用windows系統(tǒng)相關(guān)應(yīng)用程序,所以需要user32.dll接口內(nèi)的方法實(shí)現(xiàn)相關(guān)功能,對(duì)應(yīng)的也包括kernel32.dll。user32.dll接口的方法過(guò)多,這里不一一介紹。

控件和組件

**事件e:**本文暫不討論事件的原理機(jī)制,只討論控件觸發(fā)的事件。其實(shí)在進(jìn)行控件的事件觸發(fā)時(shí),會(huì)有兩個(gè)參數(shù)

(object sender, EventArgs e)

sender是事件源,表示觸發(fā)事件的那個(gè)組件,比如說(shuō)你按下按鈕,那么sender就是按鈕
EventArgs是事件參數(shù),比如說(shuō)你用鼠標(biāo)點(diǎn)擊窗體,那么EventArgs是會(huì)包含點(diǎn)擊的位置等等,它用來(lái)輔助你處理事件。

到此這篇關(guān)于C#模擬實(shí)現(xiàn)QQ窗體功能的文章就介紹到這了,更多相關(guān)C# QQ窗體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中l(wèi)ock用法詳解

    C#中l(wèi)ock用法詳解

    這篇文章主要介紹了C#中l(wèi)ock用法,以實(shí)例形式詳細(xì)分析了lock語(yǔ)句的用法及用途,需要的朋友可以參考下
    2014-11-11
  • c#與js隨機(jī)數(shù)生成方法

    c#與js隨機(jī)數(shù)生成方法

    這篇文章主要介紹了c#與js隨機(jī)數(shù)生成方法,實(shí)例分析了C#與js生成隨機(jī)數(shù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 詳解C#讀寫(xiě)Excel的幾種方法

    詳解C#讀寫(xiě)Excel的幾種方法

    這篇文章主要介紹了詳解C#讀寫(xiě)Excel的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Unity繪制二維動(dòng)態(tài)曲線

    Unity繪制二維動(dòng)態(tài)曲線

    這篇文章主要為大家詳細(xì)介紹了Unity繪制二維動(dòng)態(tài)曲線,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 用C#編寫(xiě)獲取遠(yuǎn)程IP,MAC的方法

    用C#編寫(xiě)獲取遠(yuǎn)程IP,MAC的方法

    用C#編寫(xiě)獲取遠(yuǎn)程IP,MAC的方法...
    2007-04-04
  • C#中的那些常用加密算法

    C#中的那些常用加密算法

    本文主要講解一下C#常用的那些加密算法,包括MD5加密、SHA1加密、Base64加密、Des加密、RSA加密等,需要的朋友可以參考下
    2020-11-11
  • 對(duì)C#中public、private、protect的區(qū)別說(shuō)明

    對(duì)C#中public、private、protect的區(qū)別說(shuō)明

    這篇文章主要介紹了對(duì)C#中public、private、protect的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • C#入門(mén)教程之集合ArrayList用法詳解

    C#入門(mén)教程之集合ArrayList用法詳解

    這篇文章主要介紹了C#入門(mén)教程之集合ArrayList用法,結(jié)合具體實(shí)例分析了C#中集合的概念、功能、創(chuàng)建與使用方法,需要的朋友可以參考下
    2017-06-06
  • 基于C#實(shí)現(xiàn)的多生產(chǎn)者多消費(fèi)者同步問(wèn)題實(shí)例

    基于C#實(shí)現(xiàn)的多生產(chǎn)者多消費(fèi)者同步問(wèn)題實(shí)例

    這篇文章主要介紹了基于C#實(shí)現(xiàn)的多生產(chǎn)者多消費(fèi)者同步問(wèn)題,包括了加鎖與釋放鎖,以及對(duì)應(yīng)臨界資源的訪問(wèn)。是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • c# 實(shí)時(shí)曲線圖示例代碼

    c# 實(shí)時(shí)曲線圖示例代碼

    這篇文章主要介紹了如何用c# 實(shí)現(xiàn)實(shí)時(shí)曲線圖,文中講解非常細(xì)致,代碼幫助大家更好參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

天峨县| 无极县| 盘山县| 大足县| 井研县| 巍山| 徐州市| 金秀| 孝感市| 巴林左旗| 普安县| 遵化市| 安国市| 奉新县| 开远市| 通辽市| 青田县| 定远县| 安仁县| 喜德县| 泰州市| 吴江市| 五家渠市| 赫章县| 郎溪县| 沾化县| 义马市| 红原县| 石门县| 平阴县| 南昌市| 衡水市| 休宁县| 深圳市| 南丰县| 玉溪市| 建阳市| 白河县| 汝州市| 来安县| 许昌市|