我有一個應用程序有幾個窗口,我希望它們中的一些(我將調用CMyLockedFrameWndEx
,因爲它們派生自CFrameWndEx
)保持放置在改變系統顯示區域後的位置。 我的應用程序的所有窗口的父項都是NULL。鎖定窗口位置顯示更改
我已經設法已經趕上WM_DISPLAYCHANGE
消息時,我把第二臺顯示器的位置相對第一個;當我連接或斷開第二臺顯示器的HDMI電纜時,我也趕上了WM_DEVICECHANGE
。我在CMyLockedFrameWndEx::WindowProc
截獲了他們。
之後發生自動窗口重新定位。我注意到,因爲我已在CMyLockedFrameWndEx::OnWindowPosChanging
和CMyLockedFrameWndEx::OnWindowPosChanged
上放置了斷點,並且在我遇到WindowProc
的事件之後它們停止。這個工作流程似乎是無關我描述成我WindowProc
方法事件的捕捉是:
LRESULT CMyLockedFrameWndEx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_DISPLAYCHANGE)
{
TRACE(_T("DISPLAY CHANGE"));
return 0L;
}
if (message == WM_SYSCOMMAND)
{
TRACE(_T("SYSCOMMAND"));
if (wParam == SC_MOVE)
{
return 0L;
}
}
if (message == WM_WININICHANGE)
{
TRACE(_T("WININICHANGE"));
if (wParam == SPI_SETWORKAREA)
{
return 0L;
}
}
return __super::WindowProc(message, wParam, lParam);
}
和傳遞OnWindowPosChanging
或OnWindowPosChanged
時,流量並非來自由我處理的WindowProc
的具體情況。這是一個問題。
我試圖按照調用堆棧來查看哪些窗口發送了WM_WINDOWPOSCHANGING
或WM_WINDOWPOSCHANGED
消息,但我沒有成功。我甚至試圖使用Spy ++ 64來檢測郵件的發件人是誰,但我沒有成功。看到誰是發送者的整個想法是:如果它與系統的顯示相關聯,則更改是事先檢測並且彈出自動重新定位甚至發生。
因爲我還沒有成功,我能做些什麼來使窗口免疫系統的顯示變化?
謝謝。
請問您能解釋一下:當您連接第二個屏幕時,位於第一個屏幕上的窗口發生了什麼,例如(100,100)?它移動嗎?去哪兒? –
問題不在那裏。問題是當我斷開第二個屏幕時,我不希望系統自動將窗口放在第一個窗口上。即使斷開電纜連接,我也希望窗口繼續在第二個屏幕上的位置。當然,這將是** HIDDEN **,但這是我正在尋找的。 – sergiol