首頁  >  文章  >  電腦教學  >  螢幕視窗句柄是指什麼?

螢幕視窗句柄是指什麼?

WBOY
WBOY轉載
2024-01-23 21:24:15733瀏覽

螢幕視窗句柄是指什麼?

取得螢幕的視窗句柄是什麼意思

了解什麼是句柄就好理解了

就是要得到這個視窗的識別碼

句柄就是用來區分各種記憶體物件的唯一識別符號,是個32位元整數。

有些是整個系統唯一(如視窗句柄),有些是目前進程或執行緒中唯一

(如執行緒句柄,全域的有另一個識別符)。

詳細的可分為許多種,都是以H開頭的。在VB中使用時全部都用Long。

常見的有視窗句柄(HWND),裝置描述表句柄(HDC),記憶體句柄(HMEM),

檔案句柄,進程句柄,線程句柄,筆的類型句柄(HPEN),字體句柄(HFONT),

區域句柄(HRGN)等等。

在申請句柄時是要佔用資源的,分成三類SYSTEM、USER、GDI。

而WINDOWS的資源是固定的,不隨記憶體的擴大而擴大,所以使用完以後一定要釋

放。

>

如果只用VB本身的程式碼一般是不會用到句柄的,但要是使用API​​函數的話,

大多數會使用。

再Windows系統中,句柄(我一直覺得這個字翻譯得特別彆扭)分成三大類:Kernel

Handle、UserHandle和應用程式自訂的Handle。

KernelHandle其實是進程內Kernel物件的指標表索引,Kernel物件包含進程、文字

件、訊號等。但是MS為了掩蓋一事實,在系統啟動時產生了一個所謂Obsfucator的值

(其實應該是Obfuscator,MicrosoftBugs(R):),產生Handle後將Handle與這個值異

或後返回給應用程序,所以看到的Handle都是一些很大而且毫無意義的數字。這些

Handle和索引的物件是由KRNL32.DLL和VMM32.VXD共同管理的,所以稱為Kernel

Handle。

UserHandle是用來標示視窗、DC等物件的,他們是真實的指針,但指向的不是物件

的開頭,有一個偏移量。同樣,這些物件是由USER32.DLL管理的。

第三種Handle不過是應用程式自訂的一些索引之類的東東,具體的意義和應用程式相關

如何取得控制台視窗句柄

1.呼叫 GetConsoleTitle() 來儲存目前的控制台視窗標題。

2.呼叫 SetConsoleTitle() 來將控制台標題變更為一個唯一的標題。

3.呼叫 Sleep(40),以確保已更新視窗標題。

4.呼叫 FindWindow(NULL, uniquetitle),以取得 HWND,此呼叫將傳回 HWND, 如果操作失敗,將傳回 NULL。

5.從步驟 1 中,若要恢復原始視窗標題檢索呼叫 SetConsoleTitle() 的值。

應該測試結果的 HWND。例如可以測試是否回傳的 HWND 對應到目前進程在 HWND 上呼叫 GetWindowText() 並將結果與 GetConsoleTitle() 進行比較。

範例程式碼

在下面的函數中檢索目前控制台應用程式視窗句柄 (HWND)。如果此函數成功,則傳回值是控制台視窗的句柄。如果此函數失敗,則傳回值為 NULL。省略一些錯誤檢查,為簡潔起見。

HWND GetConsoleHwnd(void)

{

#define MY_BUFSIZE 1024 // Buffer size for console window titles.

HWND hwndFound; // This is what is returned to the caller.

char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated

// WindowTitle.

char pszOldWindowTitle[MY_BUFSIZE]; // Contains original

// WindowTitle.

// Fetch current window title.

GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

// Format a "unique" NewWindowTitle.

wsprintf(pszNewWindowTitle,"%d/%d",

GetTickCount(),

GetCurrentProcessId());

// Change current window title.

SetConsoleTitle(pszNewWindowTitle);

// Ensure window title has been updated.

Sleep(40);

// Look for NewWindowTitle.

hwndFound=FindWindow(NULL, pszNewWindowTitle);

// Restore original window title.

SetConsoleTitle(pszOldWindowTitle);

return(hwndFound);

}

50分如何取得桌面所有視窗的句柄

#include

#include

using namespace std;

//用於EnumWindows的回呼函數

BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lparam)

{

vector *pvec = (vector*)lparam;

pvec->push_back(hwnd);

return TRUE;

}

void main()

{

vector vec;

EnumWindows(EnumProc,(LPARAM)&vec);

}

這個是win32控制台程式專案裡寫的,如果要在MFC下的話,只要包含

#include 並且using namespace std;

EnumProc定義在前面,按鈕回應函數裡加入main函數裡的那兩句話就可以了。

我這裡測試取得到了407個句柄

#

以上是螢幕視窗句柄是指什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:docexcel.net。如有侵權,請聯絡admin@php.cn刪除