任意のウィンドウへメッセージを送る
ここでは、トップレベル・ウィンドウの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]);
}