プロジェクト

全般

プロフィール

クライアント側で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);
}

ファイル

KGTN2011012102.pdf (73.8 KB) kitasp 技術センター, 2011/01/21 14:10