画面に存在するウィンドウハンドルを列挙したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
立花希海
記事: 9
登録日時: 13年前
連絡を取る:

画面に存在するウィンドウハンドルを列挙したい

#1

投稿記事 by 立花希海 » 12年前

こんにちは。
画面に存在するウィンドウハンドルを列挙したいと思っています。
ソースのようにすればウィンドウハンドルを得る事ができますが
ハンドルを持つものが全て列挙されてしまいます。
画面に存在するウィンドウ、要するに ALT + TAB で選択ができるウィンドウ(デスクトップを含む、でもデスクトップであることは判別したい)
をその中から判別したいのですがどのようにするのがよいのでしょうか。

windows XP以上、Visual Studio 2005

コード:

int	s_ii = 0;
TCHAR	s_sWork[256][256];


void	test()
{
	s_ii = 0;
	EnumWindows( EnumWindowsProc , (LPARAM)0 );
}


Bool CALLBACK	EnumWindowsProc( HWND hwnd , LPARAM lp )
{
	TCHAR	strWindowText[ 1024 ];
	
	if( IsIconic( hwnd ) )			return TRUE;	// 最小化は弾く
	if( NULL != GetParent( hwnd ) )	return TRUE;	// 子は弾く
//	if( NULL != GetAncestor( hwnd, GA_PARENT ) )	return TRUE;	// これでは判断できず
	
	GetWindowText( hwnd , strWindowText, 1024 );
	
	if (strWindowText[0] == 0) return TRUE;	// タイトルのないものは弾く
	
	STRING_cpy( s_sWork[s_ii++], strWindowText );
	
	return TRUE;
}
マルチバイトを忘れずに

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画面に存在するウィンドウハンドルを列挙したい

#2

投稿記事 by softya(ソフト屋) » 12年前

よく調べてないですが、SHOWで有ることを判定すればよいのでは?

【追記】
「ウインドウの最大化/最小化/通常の状態 - 科学太郎 | ブクログのパブー」
http://p.booklog.jp/book/14945/page/169838
こんな感じでどうでしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 画面に存在するウィンドウハンドルを列挙したい

#3

投稿記事 by ISLe » 12年前

可視かどうかならIsWindowVisibleのほうが簡単ですけど。

それを加えるとALT+TABと一致するみたいです。
ただしALT+TABのほうは最小化されたウィンドウも表示されます。

あとは、プロセスをチェックして、デスクトップガジェットを無視したり、Program Manager→デスクトップと読み替えたりしているようです。

立花希海
記事: 9
登録日時: 13年前
連絡を取る:

Re: 画面に存在するウィンドウハンドルを列挙したい

#4

投稿記事 by 立花希海 » 12年前

以下のやり方で無事取得できました。ありがとうございます。

コード:

int	s_ii = 0;
TCHAR	s_sWork[256][256];


void	test()
{
	s_ii = 0;
	EnumWindows( EnumWindowsProc , (LPARAM)0 );
}


Bool CALLBACK	EnumWindowsProc( HWND hWnd, LPARAM lp )
{
	TCHAR	szTitle[ 1024 ];
	TCHAR	szClass[ 1024 ];
	
	
	if( !IsWindowVisible( hWnd ) )						return TRUE;
	if( !GetWindow( hWnd, GW_OWNER ) == NULL )			return TRUE;
	
	GetWindowText( hWnd , szTitle, sizeof(szTitle) );
	GetClassName( hWnd, szClass, sizeof(szClass) );    // クラス文字列の取得
	if( szTitle[0] == 0 )								return TRUE;
	if( strcmp( szClass, TEXT("Progman") ) == 0 )		return TRUE;
	
	strcpy( s_sWork[s_ii++], szTitle );
	
	return TRUE;
}
マルチバイトを忘れずに

閉鎖

“C言語何でも質問掲示板” へ戻る