他のウインドウのハンドルを取得する

  HWND FindWindow(lpszClass, lpszWindow)



FindWindow を使うには、ウインドウの「クラス名」が必要になります。

そこで、Microsoft SPY++ を使用してクラス名を調べてみます。
「スパイ」から「ウインドウ」を選んで、ウインドウの一覧を表示させ
て、「検索」から「ウインドウ検索」を選んで検索ダイアログを表示
させます。

ファインタ゜ーツールを目的のウインドウのタイトルにドラッグして
下さい。



  取得



  
if( LOWORD(wParam) == IDC_FINDWINDOW ) {
	wsprintf( Buffer, "%08x", FindWindow( "Notepad", "無題 - メモ帳" ) );
	CharUpperBuff( Buffer, lstrlen( Buffer ) );
	SetWindowText( GetDlgItem( hDlg, IDC_COUNT ), Buffer );
	return TRUE;
}
  



  クラス名を知らなくても取得する

  
以下の関数を定義して、EnumWindows 関数で呼び出します。

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam )
{
	char ClassName[512];
	char TitleName[512];
	char Buffer[512];

	GetClassName( hwnd, ClassName, 512 );
	GetWindowText( hwnd, TitleName, 512 );

	if ( lstrcmp( TitleName, "無題 - メモ帳" ) == 0 ) {
		wsprintf( Buffer, "%08x", hwnd );
		CharUpperBuff( Buffer, lstrlen( Buffer ) );
		SetWindowText( GetDlgItem( (HWND)lParam, IDC_COUNT ), Buffer );
		return FALSE;
	}

	return TRUE;
}
  



  メモ帳のフォントダイアログを表示させる

  
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam )
{
	char ClassName[512];
	char TitleName[512];
	char Buffer[512];

	GetClassName( hwnd, ClassName, 512 );
	GetWindowText( hwnd, TitleName, 512 );

	if ( lstrcmp( TitleName, "無題 - メモ帳" ) == 0 ) {
		wsprintf( Buffer, "%08x", hwnd );
		CharUpperBuff( Buffer, lstrlen( Buffer ) );
		SetWindowText( GetDlgItem( (HWND)lParam, IDC_COUNT ), Buffer );

		PostMessage(
			hwnd
			,WM_COMMAND
			,MAKEWPARAM(LOWORD(33),HIWORD(0))
			,0
		);

		return FALSE;
	}

	return TRUE;
}
  

この「33」というID を調べるには、「SPY++」を使用します



  ウインドウハンドルの一覧

ウインドウハンドルから、タイトルテキストとクラス名と実行ファイル名を
取得してリストビューに一覧を表示させます

  
#include "tlhelp32.h"
#include "commctrl.h"
  

  
int nCount;
  

  
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam );
  

  
// ******************************************************************************
// メッセージ ハンドラ
// ******************************************************************************
LRESULT CALLBACK MyDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	int id;
	LV_COLUMN title;

	switch( message )
	{
		case WM_INITDIALOG:
			title.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
			title.fmt = LVCFMT_LEFT;

			title.cx = 120;
			title.pszText = "ウインドウハンドル";
			title.iSubItem = 0;
			ListView_InsertColumn(GetDlgItem(hDlg,IDC_LIST), 0, &title);

			title.cx = 200;
			title.pszText = "タイトル";
			title.iSubItem = 1;
			ListView_InsertColumn(GetDlgItem(hDlg,IDC_LIST), 1, &title);

			title.cx = 100;
			title.pszText = "クラス名";
			title.iSubItem = 2;
			ListView_InsertColumn(GetDlgItem(hDlg,IDC_LIST), 2, &title);

			title.cx = 200;
			title.pszText = "プログラムファイル名";
			title.iSubItem = 3;
			ListView_InsertColumn(GetDlgItem(hDlg,IDC_LIST), 3, &title);

			return TRUE;

		case WM_COMMAND:
			id = LOWORD(wParam); 
			switch( id ) {
				case IDOK:
					PostMessage( GetParent( hDlg ),WM_CLOSE, 0, 0 );
					break;
				case IDC_EXECMEMO:
					nCount = 0;
					EnumWindows( EnumWindowsProc, (LPARAM)hDlg );
					break;
			}
			break;
	}
	return FALSE;
}

// ******************************************************************************
// 列挙
// ******************************************************************************
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam )
{
	LV_ITEM field;
	char Buffer[3][512];
	DWORD ProcessId;
	HANDLE hSnapshot;
	PROCESSENTRY32 pe;
	HWND hList; 

	hList = GetDlgItem( (HWND)lParam, IDC_LIST);

	wsprintf( Buffer[0], "%08x", hwnd ); 
	CharUpperBuff( Buffer[0], lstrlen( Buffer[0] ) );
	field.mask = LVIF_TEXT;
	field.pszText = Buffer[0];
	field.iItem = nCount;
	field.iSubItem = 0;
	ListView_InsertItem(hList, &field);

	GetWindowText( hwnd, Buffer[1], 512 );
	field.pszText = Buffer[1];
	field.iItem = nCount;
	field.iSubItem = 1;
	ListView_SetItem(hList, &field);

	GetClassName( hwnd, Buffer[2], 512 );
	field.pszText = Buffer[2];
	field.iItem = nCount;
	field.iSubItem = 2;
	ListView_SetItem(hList, &field);

	GetWindowThreadProcessId( hwnd, &ProcessId );
	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0);
	if (hSnapshot)
	{
		pe.dwSize = sizeof(PROCESSENTRY32);
		if ( Process32First(hSnapshot, &pe) ) {
			while( 1 ) {
				if (pe.th32ProcessID == ProcessId) {
					field.pszText = pe.szExeFile;
					field.iItem = nCount;
					field.iSubItem = 3;
					ListView_SetItem(hList, &field);
					break;
				}
				Process32Next(hSnapshot, &pe);
			}
		}
		CloseHandle(hSnapshot);
	}

	nCount++;

	return TRUE;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ