ウィンドウのテキストが事前に保存されている場所についての質問に答えるには: 私にはよくわかりませんし、特定のウィンドウもわかりません。その情報を取得するには、代わりにウィンドウ マネージャーに問い合わせる必要があります。
ウィンドウに関連するすべての情報は、ウィンドウ マネージャーによって維持される内部構造に格納されます。ウィンドウ マネージャーは Win32k.sys によって実装されるため、これらの内部構造はカーネル メモリに常駐します。は、ウィンドウ マネージャによって制御されるテーブルへのHWND
インデックスとして機能します。テーブル エントリは読み取り専用でユーザー空間メモリにマップされますが、必要な情報を取得するのはかなり面倒です。
これまでのところ、とても悪い。しかし、まだすべてが失われたわけではありません。必要な情報は引き続き取得できます。
最も簡単なオプションは、Spy++ (Spyxx.exe) を使用することです。Visual Studio の一部として出荷され、ウィンドウ固有の情報を取得するのに役立ちます。特に、ウィンドウのテキストを表示します。必要に応じて、Spy -> Find Window...[Ctrl] (または+を押すF) に移動し、ウィンドウのハンドルを入力します (0x プレフィックスのない 16 進数)。ただし、情報は自動的に更新されません。[更新] ボタンを手動でクリックする必要があります。
Visual Studio のデバッガー内でリアルタイムの情報が必要な場合は、デバッガー式評価アドインを作成する必要があります。式エバリュエーターは、Microsoft によって正式にサポートされていません。そのため、公式のドキュメントはありません。Visual Studio 2012 デバッガー用のカスタム ネイティブ ビジュアライザー DLL を作成する方法は? そのルートをたどりたい場合に役立つ情報を提供します。ウィンドウのテキスト エントリを表示する式エバリュエーターは次のようになります。
HwndEEAddin.h:
// HwndEEAddin.h : main header file for the NatvisAddIn DLL
//
#if !defined( INC_HWNDEEADDIN_H_ )
#define INC_HWNDEEADDIN_H_
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#define ADDIN_API extern "C" __declspec(dllexport)
/* DebugHelper structure used from within the */
typedef struct tagDEBUGHELPER
{
DWORD dwVersion;
BOOL (WINAPI *ReadDebuggeeMemory)( struct tagDEBUGHELPER *pThis, DWORD dwAddr, DWORD nWant, VOID* pWhere, DWORD *nGot );
// from here only when dwVersion >= 0x20000
unsigned __int64 (WINAPI *GetRealAddress)( struct tagDEBUGHELPER *pThis );
BOOL (WINAPI *ReadDebuggeeMemoryEx)( struct tagDEBUGHELPER *pThis, unsigned __int64 qwAddr, DWORD nWant, VOID* pWhere, DWORD *nGot );
int (WINAPI *GetProcessorType)( struct tagDEBUGHELPER *pThis );
} DEBUGHELPER;
/* Exported Functions */
ADDIN_API HRESULT WINAPI AddIn_HWND( DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t maxResult, DWORD reserved );
#endif // !defined( INC_HWNDEEADDIN_H_ )
HwndEEAddin.cpp:
#include "HwndEEAddin.h"
#include <strsafe.h>
ADDIN_API HRESULT WINAPI AddIn_HWND( DWORD dwAddress, DEBUGHELPER* pHelper, int /*nBase*/, BOOL bUniStrings, char *pResult, size_t maxResult, DWORD /*reserved*/ )
{
HRESULT hr = E_FAIL;
HWND hWnd = reinterpret_cast< HWND >( dwAddress );
if ( hWnd != NULL )
{
bool bGotWindowText = false;
CHAR asciiWindowText[ 128 ] = { 8 };
if ( IsWindowUnicode( hWnd ) )
{
WCHAR buffer[ 128 ] = { 0 };
if ( GetWindowTextW( hWnd, buffer, ARRAYSIZE( buffer ) ) )
{
if ( WideCharToMultiByte( CP_THREAD_ACP, 0x0, buffer, -1, asciiWindowText, ARRAYSIZE( asciiWindowText ), NULL, NULL ) > 0 )
{
bGotWindowText = true;
}
}
}
else
{
if ( GetWindowTextA( hWnd, asciiWindowText, ARRAYSIZE( asciiWindowText ) ) )
{
bGotWindowText = true;
}
}
if ( bGotWindowText )
{
hr = StringCbPrintfA( pResult, maxResult, "{pText=\"%s\"}", asciiWindowText );
}
}
return hr;
}
Visual Studio 2010 以降でアドインを登録するには、次のファイルと共に .dll を %USERPROFILE%\Documents\Visual Studio 2012\Visualizers にコピーする必要があります。
HwndEEAddin.natvis:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<!-- Place this file and the AddIn-DLL to this folder: %USERPROFILE%\My Documents\Visual Studio 2012\Visualizers\ -->
<Type Name="HWND__">
<DisplayString LegacyAddin="HwndEEAddin.dll" Export="_AddIn_HWND@28"></DisplayString>
</Type>
</AutoVisualizer>
2010 より前のバージョンの Visual Studio では、次のエントリを [AutoExpand] セクションに追加して autoexp.dat を編集する必要があります。
HWND__ = $ADDIN(HwndEEAddin.dll,_AddIn_HWND@28)
.dll は devenv.exe ディレクトリまたは PATH 上にある必要があります。それ以外の場合は、完全修飾パス名を使用する必要があります。VS 2010 より前の Visual Studio 式エバリュエーターに関する追加情報は、Visual Studio デバッガーによるデータの表示のカスタマイズ にあります。