網站首頁 編程語言 正文
案例簡述
通過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
相關推薦
- 2024-04-23 Win11老是提示資源管理器已停止工作怎么解決
- 2022-03-15 react 編譯警告 chunk common [mini-css-extract-plugin]
- 2022-03-19 使用Docker搭建MQTT服務器的過程詳解_docker
- 2022-10-04 C語言實現倒置字符串的兩種方法分享_C 語言
- 2022-06-28 使用?Docker?Compose?構建復雜的多容器?App的方法_docker
- 2022-05-28 使用Docker部署ASP.NET?Core程序_基礎應用
- 2022-04-27 Shell獲取路徑操作(dirname?$0?pwd)的實現_linux shell
- 2023-11-14 k8s安裝部署metrics-server;監測集群狀況
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支