ウィンドウAPIを使用しているc ++のプロセスがあります。自分のプロセスのHWNDを取得したい。どうすればそれを可能にすることができるのか、親切に案内してください。
(誤って)プロセスにはHWNDが1つしかないと想定しています。これは一般的には真実ではないため、Windowsはそれを取得するためのAPIを提供できません。プログラムは2つのウィンドウを作成し、結果として2つのHWNDを持つ可能性があります。 OTOH、プログラムが単一のウィンドウのみを作成する場合、そのHWNDをグローバル変数に格納できます。
processハンドルの取得について話している場合、それはHWND
ではありません(これはwindowhandle)、ただしHANDLE
(つまり、カーネルオブジェクトハンドル);現在のプロセスに関連する疑似ハンドルを取得するには、他の人が説明したように GetCurrentProcess
を使用できます。
一方、アプリケーションのメインウィンドウへのHWND
(awindowハンドル)を取得する場合は、既存のウィンドウをウォークする必要があります。 EnumWindows
および GetWindowThreadProcessId
で所有権を確認するには、返されたプロセスIDを GetCurrentProcessId
。それでも、この場合、メインウィンドウのハンドルを変数に保存する方が、作成時にすべての混乱を招くのではなく、変数に保存することをお勧めします。
とにかく、すべてのハンドルが同じであるとは限らないことに常に注意してください。特に、HANDLE
sとHWND
sは完全に異なる獣です:最初のものはカーネルハンドル(=カーネル管理オブジェクトへのハンドル)です)および一般的なカーネルハンドル操作関数(DuplicateHandle
、CloseHandle
、...)で操作されますが、2番目の関数はウィンドウマネージャーに関連するハンドルです。 OS、および異なる機能のセットで操作されます。
実際には、理論的にはHWND
はHANDLE
の同じ「数値」値を持つ可能性がありますが、それらは完全に異なるオブジェクトを参照します。
_GetConsoleWindow();
_
「戻り値は、呼び出しプロセスに関連付けられたコンソールが使用するウィンドウへのハンドルか、関連するコンソールがない場合はNULLです。」
https://msdn.Microsoft.com/en-us/library/windows/desktop/ms683175(v = vs.85).aspx
GetActiveWindow()
かもしれません[〜#〜] [〜#〜]が答えではないかもしれませんが、役に立つかもしれません
「戻り値は、呼び出しスレッドのメッセージキューに接続されているアクティブウィンドウへのハンドルです。それ以外の場合、戻り値はNULLです。」 > msdn GetActiveWindow()docs
ただし、グラフィカルウィンドウはポップアップしません-ので、あなたは/アプリがウィンドウを作成した...例CreateWindow()
はHWND
ハンドルを返すため、必要なのは保存して取得することだけです...
GetCurrentProcess()
関数は、現在のプロセスを参照する疑似ハンドルを返します。このハンドルは、プロセスハンドルパラメータを取るほとんどのWin32 API関数で使用できます。
ドキュメントには、必要に応じて実際のハンドルに変換する方法など、この疑似ハンドルに関する詳細情報が含まれています。
Kernel32.dllからHANDLE WINAPI GetCurrentProcess(void);
を使用できます。
MSDNエントリ here を参照してください。
ここに別の答えがあります:
this-> GetSafeHwnd();
私の例はプロセスを扱うことではありませんが、おそらくこれが必要です:
HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);
これは、IDCL_COMBOBOX
で指定されたコントロールのHWNDを返します。