);
A window can be moved to the top of the Z-order either by setting the pWndInsertAfter parameter to &wndTopMost and ensuring that the SWP_NOZORDER flag is not set or by setting a window’s Z-order so that it is above any existing topmost windows. When a nontopmost window is made topmost, its owned windows are also made topmost. Its owners are not changed.
得到窗口的大小,可以使用函數GetSystemMetrics
int GetSystemMetrics(int nIndex);
代碼:
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(S·Μ_CXSCREEN);
cyScreen=GetSystemMetrics(S·Μ_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
SetHook(m_hWnd);
因為第一個參數設置為&wndTopMost,這時程序始終處於頂層窗口,
不管怎樣切換窗口,我們的窗口顯示在最前麵。
四、如何實現在切換到其他線程時,也能響應F2退出程序
在程序中,我們屏蔽了鼠標和鍵盤,但是我們留下了一個退出程序的後門(F2)。
前麵講過動態鏈接庫共享性的原理,多個進程可以共享同一份代碼與數據頁,
按道理切換到其它線程之後,按下F2應該也可以退出程序才對,
但是發現當切換到其他程序後,再按F2 程序不會退出,
這是因為係統的頁麵拷貝機製,如果係統發現被某線程要修改某個數據頁麵,
它就會先拷貝一份頁麵數據,再對新的頁麵數據進行修改,
其它沒有更新數據的線程繼續使用舊的頁麵數據。
比如:SetHook(HWND hwnd)中將形參傳遞給了一個全局變量g_hWnd
,那麼調用SetHook的線程將使用新的存放了hwnd的數據頁麵,
而其它的線程繼續使用舊的數據頁麵,所以在其它線程成為活動窗口的時候,
按下F2時,因為沒有g_hWnd沒有傳遞到hwnd窗口,所以按下F2沒有反應。
我們可以通過創建一個新的節,將全局變量放到這個節當中,然後將這個節設置為一個共享的節,
這樣全局變量就可以在多個線程間共享,從而使切換到其他線程時也能按下F2退出程序。
要顯示動態鏈接庫的節,可以使用命令行: dumpbin -headers Hook.dll
如何創建一個新的節?
如果確實想在其他程序窗口下關閉我們的程序窗口,可以把共享窗口句柄,使係統不再進行頁麵拷貝,方法是使用下麵語句把窗口句柄設為共享: