ウィンドウ画面を表示、ボタンを押すと設定したファイルをShellExecuteExで起動させています。
大きい画面を表示するファイルを起動させ、そのファイルを閉じると
ボタンを押したウィンドウが下に下がって表示されてしまうのですが、これは何故でしょうか?
理想はそのファイルが閉じたら、ボタンを押したウィンドウがアクティブになることです。
ウィンドウ画面を表示 --> A
ファイルをShellExecuteExで起動 --> B
AからBを起動してBを閉じるとAの上に別のウィンドウが来てる、
ということですか?
> 理想はそのファイルが閉じたら、ボタンを押したウィンドウがアクティブに
> なることです。
もし、自分とは別プロセスのウィンドウがアクティブになってしまっている
場合には、以下のようにするとうまくいくと思います。
SHELLEXECUTEINFO info;
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO));
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.fMask = SEE_MASK_NOCLOSEPROCESS;
info.hwnd = GetSafeHwnd(); // 適当なウィンドウを指定します
info.lpFile = szFileName;
info.lpVerb = L"open";
info.nShow = SW_SHOW;
bRet = ShellExecuteEx(&info);
if (bRet) {
// 起動したファイルの終了を待つ
WaitForSingleObject(info.hProcess, INFINITE);
CloseHandle(info.hProcess);
// 自分が自分をアクティブにする
SetForegroundWindowEx(hWnd); // <-- アクティブにしたいウィンドウを指定
}
// サポート用の関数
void SetForegroundWindowEx(HWND hWnd)
{
int nTargetID, nForegroundID;
DWORD sp_time;
nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
nTargetID = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(nTargetID, nForegroundID, TRUE);
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &sp_time, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) 0, 0);
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) sp_time, 0);
AttachThreadInput(nTargetID, nForegroundID, FALSE);
}