任意のウィンドウへメッセージを送る


 ここでは、トップレベル・ウィンドウのHandleを列挙し、任意に指定されたトップレベル・ウィンドウへ
メッセージを送る方法を示します。

【使用するAPI】

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

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

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

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

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

     SendMessage      :   ウィンドウへメッセージを送る

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

【サンプル】

//-------------------------------------------------------
//Windows Handleを列挙する処置
CStringArray m_strWinTxt;
int m_WinCount = 0;
HWND m_Handle[999];

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
	char buf[99];

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

	if(hwnd){
		//Windows Titleを格納
		m_strWinTxt.Add(buf);

		m_Handle[m_WinCount] = hwnd;

		m_WinCount++;

		//次のHandleを取得のためtureを返す
		return(true);
	}
	else{
		//Windows Handleの列挙を止める
		return(false);
	}
}


//----------------------------------------------------------------
//Windowを終了させるメッセージを送る
BOOL UseSendMessage(HWND hwnd)
{
	int nRet;

	//Windowを終了させるメッセージを送る
	nRet = SendMessage(hwnd, WM_CLOSE, 0, 0);

	return(true);
}


//Windows Handleを列挙
void CVc_windsendmsg_apiDlg::OnButton1() 
{
	int i;

	m_strWinTxt.RemoveAll();

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

	//列挙したWindow Titleを出力
	CListBox* myLIST1 = (CListBox *)GetDlgItem(IDC_LIST1);
	myLIST1->ResetContent();

	for( i = 0; i < m_strWinTxt.GetSize(); i++){
		myLIST1->AddString(m_strWinTxt.GetAt(i));
	}		
}

//----------------------------------------------------------------
//Windowを終了させるメッセージを送る
void CVc_windsendmsg_apiDlg::OnButton2() 
{
	int index;

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

	//取得したWindows HandleのWindowへメッセージを送る
	UseSendMessage(m_Handle[index]);
	
}