ホームページ > 記事 > コンピューターのチュートリアル > スクリーンウィンドウハンドルとは何を意味しますか?
ハンドルとは何かを知っておくと理解しやすいです
このウィンドウの識別コードを取得します
ハンドルは、さまざまなメモリ オブジェクトを区別するために使用される一意の識別子であり、32 ビットの整数です。
システム全体に固有のもの (ウィンドウ ハンドルなど) もあれば、現在のプロセスまたはスレッドに固有のものもあります
(スレッドハンドルなど、グローバルなものには別の識別子があります)。
細かく分けるとHから始まるたくさんの種類に分かれます。 VB で使用する場合はすべて Long を使用します。
一般的なものには、ウィンドウ ハンドル (HWND)、デバイス記述テーブル ハンドル (HDC)、メモリ ハンドル (HMEM) などがあります。
ファイルハンドル、プロセスハンドル、スレッドハンドル、ペンタイプハンドル(HPEN)、フォントハンドル(HFONT)、領域ハンドル (HRGN) など。
ハンドルを申請すると、SYSTEM、USER、GDI の 3 つのカテゴリに分けられるリソースが占有されます。
WINDOWSのリソースは固定されており、メモリの拡張に伴って拡張されないため、使用後は解放する必要があります
###置く。
#>>VB 独自のコードのみを使用する場合、通常はハンドルを使用しませんが、API 関数を使用する場合は、
ほとんどの人がそれを使用します。
Windows システムでは、ハンドル (この言葉は特に訳しにくいと常々感じています) は 3 つのカテゴリに分類されます。 カーネル
ハンドル、ユーザーハンドル、およびアプリケーション定義のハンドル。
KernelHandle は、実際にはプロセス内のカーネル オブジェクトのポインタ テーブル インデックスです。カーネル オブジェクトにはプロセスとファイルが含まれます
ピース、シグナルなどただし、その事実を隠すために、MS はシステムの起動時にいわゆる Obsfucator 値を生成しました。
(実際には、Obfuscator、MicrosoftBugs(R) である必要があります:) ハンドルを生成した後、ハンドルとこの値を区別します
または がアプリケーションに返されるため、表示されるハンドルはすべて大きな意味のない数字になります。これら###
ハンドル オブジェクトとインデックス オブジェクトは KRNL32.DLL と VMM32.VXD によって共同管理されるため、カーネルと呼ばれます###ハンドル。
UserHandle は、ウィンドウや DC などのオブジェクトをマークするために使用されます。これらは実際のポインタですが、オブジェクトをポイントするものではありません
の先頭にオフセットがあります。繰り返しますが、これらのオブジェクトは USER32.DLL によって管理されます。
3 番目のタイプのハンドルは、アプリケーションによってカスタマイズされたインデックスの一部です。具体的な意味はアプリケーションに関連しています
コンソール ウィンドウ ハンドルを取得する方法
1. GetConsoleTitle() を呼び出して、現在のコンソール ウィンドウのタイトルを保存します。
2. SetConsoleTitle() を呼び出して、コンソールのタイトルを一意のタイトルに変更します。
4. FindWindow(NULL, uniquetitle) を呼び出して HWND を取得します。この呼び出しは HWND を返します。操作が失敗した場合は、NULL が返されます。
5. ステップ 1 から、元のウィンドウ タイトルを復元するには、SetConsoleTitle() を呼び出して値を取得します。
テスト結果の HWND をテストする必要があります。たとえば、返された HWND が、HWND 上で GetWindowText() を呼び出している現在のプロセスに対応するかどうかをテストし、その結果を GetConsoleTitle() と比較できます。
サンプルコード
次の関数は、現在のコンソール アプリケーション ウィンドウ ハンドル (HWND) を取得します。この関数が成功すると、戻り値はコンソール ウィンドウへのハンドルになります。この関数が失敗した場合、戻り値は NULL になります。簡潔にするために、一部のエラー チェックは省略されています。
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // コンソール ウィンドウ タイトルのバッファ サイズ。
HWND hwndFound; // これは呼び出し元に返されるものです。
char pszNewWindowTitle[MY_BUFSIZE]; // 捏造されたものが含まれます// ウィンドウタイトル.
char pszOldWindowTitle[MY_BUFSIZE]; // オリジナルが含まれます
// ウィンドウタイトル.
// 現在のウィンドウのタイトルを取得します。
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// 「一意の」NewWindowTitle.
をフォーマットします。
wsprintf(pszNewWindowTitle,"%d/%d",GetTickCount(),
GetCurrentProcessId());
// 現在のウィンドウのタイトルを変更します。
SetConsoleTitle(pszNewWindowTitle);
// ウィンドウのタイトルが更新されていることを確認してください。
睡眠(40);
// NewWindowTitle.
を探します。
hwndFound=FindWindow(NULL, pszNewWindowTitle);// 元のウィンドウのタイトルを復元します。
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
50 ポイント デスクトップ上のすべてのウィンドウのハンドルを取得する方法
####含む ###### ####含む ######
名前空間 std を使用します;//EnumWindows のコールバック関数
BOOL コールバック EnumProc(HWND hwnd,LPARAM lparam)
*)lparam;
TRUEを返す;
}
void main()
{
EnumWindows(EnumProc,(LPARAM)&vec);
}
これは win32 コンソール プログラム プロジェクトで書かれています。MFC で使用したい場合は、#include
をインクルードし、名前空間 std;
を使用するだけです。EnumProc は前に定義したもので、main 関数の 2 つの文をボタン応答関数に追加するだけです。
ここでテストしたところ、407 個のハンドルが得られました
以上がスクリーンウィンドウハンドルとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。