句柄相關

1.句柄是什麼?

在windows中,句柄是和對象一一對應的32位無符號整數值。對象可以映射到唯一的句柄,句柄也可以映射到唯一的對象。
2.爲什麼我們需要句柄?

更準確地說,是windows需要句柄。windows需要向程序員提供必要地編程接口,在這些接口中,允許程序員訪問、創建和銷燬對象。但是,出於封裝地考慮,windows並不想向程序員返回指針。指針包含了太多的信息。首先指針給出了對象存儲的確切位置;其次,要操作一個指針,程序員必須知道指針所指對象的內部結構特徵,也即,windows必須向程序員暴露相應的數據結構,而這些數據結構也許是操作系統想向程序員隱藏的。

如果說COM技術向用戶隱藏了數據,只暴露了接口並只允許按接口定義的方法操作數據的話,句柄這種方式則允許你按自己的方式直接操作數據,但windows又不向你直接暴露數據。直接操作數據是程序員需要的,不暴露數據是windows所需要的,句柄封裝方式實現了各取所需。

 

c# 窗口句柄有關的常見問題

1、如何獲得一個窗口的句柄?
例如獲取窗口PictureBox控件(其他控件也可以)的句柄,
IntPtr handle = pictureBox.Handle;

2、注意:窗口創建和窗口創建完畢即有句柄完全是兩回事!!!

窗口創建時,窗口並沒有創建句柄,只有Application.Run(form)或者form.Show()之後纔有句柄,即窗口只有顯示或者啓動消息循環後纔有句柄!如果創建form之後Form form = new Form(),主線程中調用form.Handle,如果句柄尚未創建,引用該屬性將強制創建句柄,對系統內的邏輯將產生致命的影響。

3、如何判斷一個窗口的句柄創建完畢?

利用IsHandleCreated 屬性:此屬性指示控件是否有與他關聯的句柄,如果已經爲控件分配了句柄,則爲 true;否則爲 false。

4、一些屬性:
(1)、CreateControl :強制創建控件,包括句柄和任何子控件
(2)、CreateHandle :爲該控件創建句柄,

      通常,不應該直接調用 CreateHandle 方法。首選的方法是調用 CreateControl 方法,此方法在創建控件時強制爲該控件及其子控件創建一個句柄。給繼承者的說明 在派生類中重寫 CreateHandle 時,請確保調用了基類的 CreateHandle 方法,以便確保已創建該句柄。
(3)、DestroyHandle :毀壞與該控件關聯的句柄
(4)、FromChildHandle :檢索包含指定句柄的控件
(5)、FromHandle :返回當前與指定句柄關聯的控件
(6)、Handle :獲取控件綁定到的窗口句柄,Handle 屬性的值是 Windows HWND。如果句柄尚未創建,引用該屬性將強制創建句柄。
(7)、IsHandleCreated :指示控件是否有與他關聯的句柄,如果已經爲控件分配了句柄,則爲 true;否則爲 false。
(8)、RecreateHandle :強制爲控件重新創制句柄
(9)、RecreatingHandle :指示當前是否在重創句柄

5.注意:
句柄是隨機量,兩次運行一般都會得到兩次不同的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章