2013-08-04 70 views
14

我正在嘗試使用函數SetForegroundWindow(HWND hWnD)。我有一些手柄,但它不作爲上述功能的參數。我的句柄是一個線程,我想在前臺運行它。Windows API中的HANDLE和HWND的區別?

HWND和HANDLE之間有什麼區別?

回答

8

「句柄」是用來表示標識系統資源(菜單,DLL模塊,內存塊等)的標記的通用術語。通常被稱爲「魔術餅乾」,通常在您首次創建資源時返回。然後您將該句柄傳遞給負責處理資源的API中的其他函數。你通常不需要知道手柄是什麼。有時它可能是一個指針,其他時候可能是一個數字,也可能是一個結構,或其他什麼。這就是爲什麼他們使用像HWND這樣的名稱來隱藏它,這只是用於識別窗口的句柄(由API函數「CreateWindow()」返回)。因此,因爲HWND已經是一個「句柄」(只是標識你創建的窗口),所以你不要將「句柄」轉換成HWND並返回。

發現這裏http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

您可以使用FindWindow函數來從應用http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

這應該讓你得到的HWND只要你有手柄,以獲得HWND你正在尋找C++ Handle as HWND?

什麼
+0

是的,tks !,但我可以將句柄轉換成hwnd嗎? – Thangnv

+1

@Thangnv這就像問「我可以從'void *'轉換爲'int *'?」嗎?這取決於。你的手柄是什麼? – timothyqiu

+0

我的句柄是一個線程,我想在前臺運行它,但它不是函數SetForegroundWindow(HWND hWnD)中的HWND。 – Thangnv

27

他們只是abstract data types

根據MSDNHANDLEHWND被定義爲:

  • HANDLEhandle的一個對象。
  • HWND是一個窗口句柄。

因此,一個HWNDHANDLE,但不是所有的HANDLE s爲HWND。事實上:

typedef void *PVOID; 
typedef PVOID HANDLE; 
typedef HANDLE HWND; 

您應該只通過HWNDSetForegroundWindow除非你知道自己在做什麼。

HWND hWnd = FindWindow(NULL, "Calculator"); 
SetForegroundWindow(hWnd); 

這首先獲得句柄名爲「計算器」與FindWindow一個窗口,然後使該窗口前臺。

+4

這些類型定義僅在未定義「STRICT」的情況下使用。如果是這樣,HWND不再被定義爲HANDLE,而是作爲一個獨特的獨立數據類型。 –

+3

@RemyLebeau'typedef'部分引用自[官方文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx)。 (但是我檢查了標題,這是你描述的方式,謝謝。) – timothyqiu