- 2012-2-15
- Visual C++
CreateProcess()等で画面を持つAP起動した場合に、
フォーカスがメインのウィンドウから起動したAPへ移動してしまう。
まぁ、当たり前ではあるが、その回避方法なぞ
SDK 版
void SetAbsoluteForegroundWindow(HWND hWnd)
{
int nTargetID, nForegroundID;
DWORD sp_time;
// フォアグラウンドウィンドウを作成したスレッドのIDを取得
nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 目的のウィンドウを作成したスレッドのIDを取得
nTargetID = GetWindowThreadProcessId(hWnd, NULL );
// スレッドのインプット状態を結び付ける
AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け
// 現在の設定を sp_time に保存
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0);
// ウィンドウの切り替え時間を 0ms にする
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0);
// ウィンドウをフォアグラウンドに持ってくる
SetForegroundWindow(hWnd);
// 設定を元に戻す
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0);
// スレッドのインプット状態を切り離す
AttachThreadInput(nTargetID, nForegroundID, FALSE ); // FALSE で切り離し
}
MFC 版
void SetAbsoluteForegroundWindow(CWnd *pWnd)
{
int nTargetID, nForegroundID;
DWORD sp_time;
// フォアグラウンドウィンドウを作成したスレッドのIDを取得
nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 目的のウィンドウを作成したスレッドのIDを取得
nTargetID = GetWindowThreadProcessId(pWnd->GetSafeHwnd(), NULL );
// スレッドのインプット状態を結び付ける
AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け
// 現在の設定を sp_time に保存
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0);
// ウィンドウの切り替え時間を 0ms にする
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0);
// ウィンドウをフォアグラウンドに持ってくる
pWnd->SetForegroundWindow();
// 設定を元に戻す
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0);
// スレッドのインプット状態を切り離す
AttachThreadInput(nTargetID, nForegroundID, FALSE ); // FALSE で切り離し
}