トップレベル・ウィンドウのハンドルを取得し、そのウィンドウをZ座標の最前面へ移動


 ここでは、トップレベル・ウィンドウのHandleを列挙し、そのHandleのウィンドウをZ座標の最善面へ移動する方法を示します。
ただし、非表示のウィンドウやタスクバーに格納されているウィンドウなどはZ座標の最善面へ移動されません。

【使用するAPI】

    [ヘッダー]
         Winuser.hで宣言、Windows.hをインクルード

  [インポートライブラリ]
          User32.lib 

   [API]
         EnumWindows          :   トップレベル・ウィンドウのHandleを列挙

         EnumWindowsProc      :   EnumWindowsを実行すると呼び出されるコールバック(CALLBACK)関数

         GetWindowText        :   タイトルバーのテキストを取得

         BringWindowToTop     :   ウィンドウをZ座標の最善面へ移動

     SetForegroundWindow  :   ウィンドウをアクティブにし、そのスレッドをZ座標の最善面へ移動

   (APIの詳細に付いては、MSDNライブラリを参照して下さい。)

【サンプル】

//取得したタイトルバーのテキスト、ハンドルを格納する配列
CStringArray m_strWinTxt;
int m_WinCount = 0;
HWND m_Handle[999];


//EnumWindowsを実行すると呼び出されるコールバック(CALLBACK)関数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
	char buf[99];

        //-----------------------------------------------------
	//Windowのタイトルを取得
	GetWindowText(hwnd, buf, 99);

	if(hwnd){
		//Windows Titleを格納して、次のHandleを取得
		m_strWinTxt.Add(buf);
		return(true);
	}
	else{
		//Windows Handleの列挙を止める
		return(false);
	}
}

void CWinhandleDlg::OnButton1() 
{
	int i;

        //-----------------------------------------------------
	//Window Handleとタイトルの列挙
	boolean result = EnumWindows(EnumWindowsProc, 0);

	//列挙したWindow Titleをリストボックスへ出力
	CListBox* myLIST1 = (CListBox *)GetDlgItem(IDC_LIST1);
	for( i = 0; i < m_strWinTxt.GetSize(); i++){
		myLIST1->AddString(m_strWinTxt.GetAt(i));
	}	
}

//Windows HandleのWindowを最前面へ移動(BringWindowToTop)
BOOL UseBringWindowToTop(HWND hwnd)
{

	//Windowを最前面へ移動
	BringWindowToTop(hwnd);

	return(true);
}

//Windows HandleのWindowを最前面へ移動(SetForegroundWindow)
BOOL UseSetForegroundWindow(HWND hwnd)
{

	//Windowを最前面へ移動
	SetForegroundWindow(hwnd);

	return(true);
}

//リスト・ボックスで選択したWindowをBringWindowToTopを使って前面に移動
void CWinhandleDlg::OnButton2() 
{
	int index;

	CListBox* myLIST1 = (CListBox *)GetDlgItem(IDC_LIST1);
	index = myLIST1->GetCurSel();

	//取得したWindows HandleのWindowを最前面へ移動
	UseBringWindowToTop(m_Handle[index]);

}

//リスト・ボックスで選択したWindowをSetForegroundWindowを使って前面に移動
void CWinhandleDlg::OnButton3() 
{
	int index;

	CListBox* myLIST1 = (CListBox *)GetDlgItem(IDC_LIST1);
	index = myLIST1->GetCurSel();

	//取得したWindows HandleのWindowを最前面へ移動
	UseSetForegroundWindow(m_Handle[index]);	
}