如果我們想改變窗口z-order,是窗口置頂.
- BringWindowToTop
- SetWindowPos
- SetForegroundWindow
BringWindowToTop:調用這個函數類似於調用SetWindowPos函數來改變窗口在Z序中的位置,但是
BringWindowToTop函數並不能使一個窗口成爲前臺窗口。
SetWindowPos:TOPMOST 會使該窗口一直置頂,保持在最頂層。
SetForegroundWindow:指定窗口的線程設置到前臺,並且激活該窗口。鍵盤輸入轉向該窗口,併爲用戶改各種可視的
記號。系統給創建前臺窗口的線程分配的權限稍高於其他線程。(當次在最頂層)
SetForegroundWindow使窗口當前置頂
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;
}