web-dev-qa-db-ja.com

現在のプロセスのHWNDを取得しています

ウィンドウAPIを使用しているc ++のプロセスがあります。自分のプロセスのHWNDを取得したい。どうすればそれを可能にすることができるのか、親切に案内してください。

16
Siddiqui

(誤って)プロセスにはHWNDが1つしかないと想定しています。これは一般的には真実ではないため、Windowsはそれを取得するためのAPIを提供できません。プログラムは2つのウィンドウを作成し、結果として2つのHWNDを持つ可能性があります。 OTOH、プログラムが単一のウィンドウのみを作成する場合、そのHWNDをグローバル変数に格納できます。

14
MSalters

processハンドルの取得について話している場合、それはHWNDではありません(これはwindowhandle)、ただしHANDLE(つまり、カーネルオブジェクトハンドル);現在のプロセスに関連する疑似ハンドルを取得するには、他の人が説明したように GetCurrentProcess を使用できます。

一方、アプリケーションのメインウィンドウへのHWND(awindowハンドル)を取得する場合は、既存のウィンドウをウォークする必要があります。 EnumWindows および GetWindowThreadProcessId で所有権を確認するには、返されたプロセスIDを GetCurrentProcessId 。それでも、この場合、メインウィンドウのハンドルを変数に保存する方が、作成時にすべての混乱を招くのではなく、変数に保存することをお勧めします。

とにかく、すべてのハンドルが同じであるとは限らないことに常に注意してください。特に、HANDLEsとHWNDsは完全に異なる獣です:最初のものはカーネルハンドル(=カーネル管理オブジェクトへのハンドル)です)および一般的なカーネルハンドル操作関数(DuplicateHandleCloseHandle、...)で操作されますが、2番目の関数はウィンドウマネージャーに関連するハンドルです。 OS、および異なる機能のセットで操作されます。

実際には、理論的にはHWNDHANDLEの同じ「数値」値を持つ可能性がありますが、それらは完全に異なるオブジェクトを参照します。

19
Matteo Italia

コンソールウィンドウを取得する

_GetConsoleWindow();
_


「戻り値は、呼び出しプロセスに関連付けられたコンソールが使用するウィンドウへのハンドルか、関連するコンソールがない場合はNULLです。」

https://msdn.Microsoft.com/en-us/library/windows/desktop/ms683175(v = vs.85).aspx

他のウィンドウを取得する

GetActiveWindow()かもしれません[〜#〜] [〜#〜]が答えではないかもしれませんが、役に立つかもしれません
「戻り値は、呼び出しスレッドのメッセージキューに接続されているアクティブウィンドウへのハンドルです。それ以外の場合、戻り値はNULLです。」 > msdn GetActiveWindow()docs

ただし、グラフィカルウィンドウはポップアップしません-ので、あなたは/アプリがウィンドウを作成した...CreateWindow()HWNDハンドルを返すため、必要なのは保存して取得することだけです...

10
jave.web

GetCurrentProcess() 関数は、現在のプロセスを参照する疑似ハンドルを返します。このハンドルは、プロセスハンドルパラメータを取るほとんどのWin32 API関数で使用できます。

ドキュメントには、必要に応じて実際のハンドルに変換する方法など、この疑似ハンドルに関する詳細情報が含まれています。

4
Greg Hewgill

Kernel32.dllからHANDLE WINAPI GetCurrentProcess(void);を使用できます。

MSDNエントリ here を参照してください。

1
Stu Mackellar

ここに別の答えがあります:

this-> GetSafeHwnd();

0
SChalice

私の例はプロセスを扱うことではありませんが、おそらくこれが必要です:

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

これは、IDCL_COMBOBOXで指定されたコントロールのHWNDを返します。

0
Denis Kolesnik