在实际开发中,可能需要当次把窗口置顶。使用BringWindowToTop发现效果不是很理想,有时候不能置顶。

BOOL ForceForegroundWindow(HWND hWnd)
{
if (!hWnd || !::IsWindow(hWnd))
return FALSE;

HWND hWndCurrentWindow = ::GetForegroundWindow();
if (hWndCurrentWindow == NULL)
{
return ::SetForegroundWindow(hWnd);
}

DWORD dwCurProcId, dwCurThreadId = ::GetWindowThreadProcessId(hWndCurrentWindow, &dwCurProcId);
DWORD dwHWndProcId;
::GetWindowThreadProcessId(hWnd, &dwHWndProcId);

BOOL bReturn = FALSE;

if (dwHWndProcId == dwCurProcId)
{
bReturn = ::SetForegroundWindow(hWnd);
}
else
{
DWORD dwMyThreadId = ::GetCurrentThreadId();

if (::AttachThreadInput(dwMyThreadId, dwCurThreadId, TRUE))
{
bReturn = ::SetForegroundWindow(hWnd);
::AttachThreadInput(dwMyThreadId, dwCurThreadId, FALSE);
}
else
{
bReturn = ::SetForegroundWindow(hWnd);
}
}

return bReturn;
}