了解什麼是句柄就好理解了
就是要得到這個視窗的識別碼
句柄就是用來區分各種記憶體物件的唯一識別符號,是個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);
}
#include
#include
using namespace std;
//用於EnumWindows的回呼函數
BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lparam)
{
vector
pvec->push_back(hwnd);
return TRUE;
}
void main()
{
vector
EnumWindows(EnumProc,(LPARAM)&vec);
}
這個是win32控制台程式專案裡寫的,如果要在MFC下的話,只要包含
#include
EnumProc定義在前面,按鈕回應函數裡加入main函數裡的那兩句話就可以了。
我這裡測試取得到了407個句柄
#以上是螢幕視窗句柄是指什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!