我正在嘗試使用函數SetForegroundWindow(HWND hWnD)
。我有一些手柄,但它不作爲上述功能的參數。我的句柄是一個線程,我想在前臺運行它。Windows API中的HANDLE和HWND的區別?
HWND和HANDLE之間有什麼區別?
我正在嘗試使用函數SetForegroundWindow(HWND hWnD)
。我有一些手柄,但它不作爲上述功能的參數。我的句柄是一個線程,我想在前臺運行它。Windows API中的HANDLE和HWND的區別?
HWND和HANDLE之間有什麼區別?
「句柄」是用來表示標識系統資源(菜單,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?
什麼他們只是abstract data types。
根據MSDN,HANDLE
和HWND
被定義爲:
HANDLE
是handle的一個對象。HWND
是一個窗口句柄。因此,一個HWND
是HANDLE
,但不是所有的HANDLE
s爲HWND
。事實上:
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
您應該只通過HWND
到SetForegroundWindow
除非你知道自己在做什麼。
HWND hWnd = FindWindow(NULL, "Calculator");
SetForegroundWindow(hWnd);
這首先獲得句柄名爲「計算器」與FindWindow
一個窗口,然後使該窗口前臺。
這些類型定義僅在未定義「STRICT」的情況下使用。如果是這樣,HWND不再被定義爲HANDLE,而是作爲一個獨特的獨立數據類型。 –
@RemyLebeau'typedef'部分引用自[官方文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx)。 (但是我檢查了標題,這是你描述的方式,謝謝。) – timothyqiu
HWND也是一個句柄,但是全球性的。 也就是說在一個過程的上下文中有效的HWND在另一個過程的上下文中也是有效的。
http://forum.sysinternals.com/internal-wnd-structure-in-win7_topic24988.html上的一些未公開信息。
「但全球化」正是我所期待的。 Thx隊友。 – Pyjong
是的,tks !,但我可以將句柄轉換成hwnd嗎? – Thangnv
@Thangnv這就像問「我可以從'void *'轉換爲'int *'?」嗎?這取決於。你的手柄是什麼? – timothyqiu
我的句柄是一個線程,我想在前臺運行它,但它不是函數SetForegroundWindow(HWND hWnD)中的HWND。 – Thangnv