ページ 11

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

Posted: 2013年2月06日(水) 01:15
by 立花希海
こんにちは。
画面に存在するウィンドウハンドルを列挙したいと思っています。
ソースのようにすればウィンドウハンドルを得る事ができますが
ハンドルを持つものが全て列挙されてしまいます。
画面に存在するウィンドウ、要するに 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;
}

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

Posted: 2013年2月06日(水) 01:21
by softya(ソフト屋)
よく調べてないですが、SHOWで有ることを判定すればよいのでは?

【追記】
「ウインドウの最大化/最小化/通常の状態 - 科学太郎 | ブクログのパブー」
http://p.booklog.jp/book/14945/page/169838
こんな感じでどうでしょう?

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

Posted: 2013年2月06日(水) 16:32
by ISLe
可視かどうかならIsWindowVisibleのほうが簡単ですけど。

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

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

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

Posted: 2013年2月07日(木) 00:47
by 立花希海
以下のやり方で無事取得できました。ありがとうございます。

コード:

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;
}