您可以使用SetWindowPos以您想要的Z順序定位窗口。我建議你攔截WM_FOCUS消息(這個時發送到接收焦點的窗口)
在你的WndProc功能,也許你可以嘗試這樣的事:
LRESULT wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
// other stuff..
switch (msg){
case WM_FOCUS:
{
HWND firstWindow; // get the first window here
HWND secondWindow; // this would be the second window
HWND thirdWindow; // this would be the third window
// TODO: initialize the windows correctly, based on your priority
SetWindowPos(firstWindow, secondWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE); // position the second window below the first window
SetWindowPos(secondWindow, thirdWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE); // position the third window below the second window
}
return 0;
}
// other messages..
}
我不太確定SetWindowPos參數的排序順序,因爲我現在無法測試代碼,但也許這可以讓你去?
如果需要攔截所有WM_消息,我會建議調用CreateWindowEx
自己的窗口類的應用程序調用,而不是(我猜)。例如:
class Window {
public
Window(){
...
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = wndProc; // <- Note this one
...
}
static LRESULT WINAPI wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
// reference: http://www.gamedev.net/community/forums/topic.asp?topic_id=303854 - Evil Steve [Moderator]
Window* parent;
// Get pointer to window
if(msg == WM_CREATE){
parent = (Window*)((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLongPtr(hwnd,GWL_USERDATA,(LONG_PTR)parent);
}
else{
parent = (Window*)GetWindowLongPtr(hwnd,GWL_USERDATA);
if(!parent) return DefWindowProc(hwnd,msg,wParam,lParam);
}
HWND prev = parent->mWin;
parent->mWin = hwnd;
LRESULT ret = parent->wndProc(msg,wParam,lParam);
parent->mWin = prev;
return ret;
}
virtual LRESULT wndProc(UINT msg, WPARAM wParam, LPARAM lParam){
}
};
在這個例子中你的應用程序會從窗口繼承,基本上提供了一個稍微修改的WndProc功能(這將是缺少HWND所以這將需要存儲在某個地方,除非你選擇它向上用戶數據)。
每當您收到消息時,Window::wndProc(HWND, UINT, WPARAM, LPARAM)
函數都會檢測到它。在這裏,您可以對任何消息進行檢查,包括(但不限於)WM_WINDOWPOSCHANGING
。
其他的事情將是:
在wndProc(UINT, WPARAM, LPARAM)
,而不是調用DefWindowProc(..)
你打電話Window::wndProc(UINT, WPARAM, LPARAM)
。然後,你可以做你的支票在那裏,而不是(如不cludge第一wndProc
功能):)
這個的缺點是,如果應用程序是別人寫的,他們需要遵守你的windowclass。正如你解釋的那樣,用戶不需要與窗口管理器交互,但是,採用這種方法,唯一的交互作用就是讓窗口管理器爲用戶創建窗口。
否則我認爲你將不得不去解決在其他答案中解釋的鉤子
我寧願它,如果用戶不應該被要求與'窗口管理器'應用程序進行交互。 我希望能有一些方法來檢測窗口順序何時改變,然後讓'窗口管理器'應用程序自動響應。例如,使用kludgey的方法是設置一個計時器,以便'窗口管理器'應用程序每隔X個時間段檢查窗口順序並在必要時重新排序。 我希望能有一些其他的消息可以用來確定何時檢查重新排序是否必要。 – JRT 2010-02-25 13:30:14