web-dev-qa-db-ja.com

Windows APIのHANDLEとHWNDの違いは?

関数SetForegroundWindow(HWND hWnD)を使用しようとしています。いくつかのハンドルがありますが、上記の関数のパラメーターとして機能していません。私のハンドルはスレッドであり、フォアグラウンドで実行したい。

HWNDとハンドルの違いは何ですか?

18
Thangnv

これらは単なる abstract data types です。

[〜#〜] msdn [〜#〜] によると、HANDLEおよびHWNDは次のように定義されます。

  • HANDLEは、オブジェクトへの ハンドル です。
  • HWNDはウィンドウのハンドルです。

したがって、HWNDHANDLEですが、すべてのHANDLEsがHWNDであるわけではありません。実際には:

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

何をしているのかわからない限り、HWNDSetForegroundWindowに渡すだけです。

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

これは、最初にFindWindowで「Calculator」というタイトルのウィンドウのハンドルを取得し、次にそのウィンドウを前面に表示します。

33
timothyqiu

「ハンドル」は、システム上のリソース(メニュー、DLLモジュール、メモリブロックなど)を識別するトークンを指すために使用される一般的な用語です。多くの場合、 「マジッククッキー」は、通常、最初にリソースを作成したときに返され、そのハンドルをリソースの処理を担当するAPIの他の関数に渡します。通常、ハンドルが何であるかを知る必要はありません。 、場合によっては数字、おそらく構造体など何でもあります。だからこそ、ウィンドウを識別するために使用される単なるハンドルであるHWND(API関数「CreateWindow()」によって返される)のような名前を使用して非表示にします。 「ハンドル」をHWNDに変換し、HWNDはすでに「ハンドル」(作成したウィンドウを単に識別するもの)であるため、再び元に戻します。

ここにあります http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

FindWindowを使用して、アプリケーションからhwndを取得できます http://msdn.Microsoft.com/en-us/library/windows/desktop/ms633499(v = vs.85).aspx

これにより、探しているものへのハンドルがあればHWNDを取得できます C++ Handle as HWND?

11
Spencer

HWNDもハンドルですが、グローバルなハンドルです。つまり1つのプロセスのコンテキストで有効なHWNDは、別のプロセスのコンテキストでも有効です。

http://forum.sysinternals.com/internal-wnd-structure-in-win7_topic24988.html に文書化されていない情報がいくつかあります。

6