ウィンドウを必ず最前面に配置する

  • デル株式会社
  • 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 で切り離し
    }

    関連記事

    ページ上部へ戻る