クライアント側でGGのウインドウを操作したいが,注意すべき点は?
技術ノート
2011/01/21
[番号]
技術ノート KGTN 2011012102
[現象]
クライアント側でGGのウインドウを操作したいが,注意すべき点は?
[説明]
GGがクライアント上に表示するウインドウは,GGサーバで実行されるアプリケーションのウインドウです.クライアント側で 「WindowsのAPIを使用して」 そのウインドウを操作した場合,GGサーバ上で動作するアプリケーションは操作内容を知りませんので,操作後に画面が崩れる等の現象が発生します.従って,原則としてクライアント側で 「WindowsのAPIを使用して」 ウインドウ操作を行うことは出来ません.
参 考1
ウインドウを最小化する・ウインドウを隠す等の単純な操作を行う場合,技術ノート KGTN#2010031501,KGTN#2010090205,KGTN#2009080501 を参考に,Zオーダーが狂わないような処理を行って下さい.幾つかのユーザ様から,このような方法で 「期待した通りの動作を実現できた」 という報告があります.
参 考2
以下のようなコードで,GGが表示するウインドウの 「非表示・表示」 が動作しているようです.
void CGGTest_SendMessageDlg::OnBnClickedOk()
{
//---
::MessageBox(NULL,_T("STEP1"),_T("GGTest_SendMessage"),MB_OK);
EnumWindows(EnumWindowsProc1,0);
::MessageBox(NULL,_T("STEP2"),_T("GGTest_SendMessage"),MB_OK);
EnumWindows(EnumWindowsProc2,0);
//---
}
BOOL CALLBACK EnumWindowsProc1(HWND hwnd,LPARAM lParam)
{
TCHAR tBufC1024,tBufT1024,tBufX1024;
//---
::GetClassName(hwnd,tBufC,(sizeof(tBufC)/sizeof(tBufC0)));
::GetWindowText(hwnd,tBufT,(sizeof(tBufT)/sizeof(tBufT0)));
_stprintf_s(tBufX,_T("'%s' - '%s'"),tBufC,tBufT);
if(_tcslen(tBufT) > 0)
{
if(_tcsicmp(tBufC,_T("DisplayClientWindowClass")) 0)
{
::MessageBox(NULL,tBufX,_T("GGTest_SendMessage#11"),MB_OK);
::ShowWindow(hwnd,SW_HIDE);
}
}
//---
return(TRUE);
}
BOOL CALLBACK EnumWindowsProc2(HWND hwnd,LPARAM lParam)
{
TCHAR tBufC[1024],tBufT[1024],tBufX[1024];
//---
::GetClassName(hwnd,tBufC,(sizeof(tBufC)/sizeof(tBufC[0])));
::GetWindowText(hwnd,tBufT,(sizeof(tBufT)/sizeof(tBufT[0])));
_stprintf_s(tBufX,_T("'%s' - '%s'"),tBufC,tBufT);
if(_tcslen(tBufT) > 0)
{
if(_tcsicmp(tBufC,_T("DisplayClientWindowClass")) 0)
{
::MessageBox(NULL,tBufX,_T("GGTest_SendMessage#21"),MB_OK);
::ShowWindow(hwnd,SW_SHOW);
::PostMessage(hwnd,WM_PAINT,0,0);
::SetForegroundWindow(hwnd);
}
}
//---
return(TRUE);
}