第27節(1 / 3)

);

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

如何創建一個新的節?

如果確實想在其他程序窗口下關閉我們的程序窗口,可以把共享窗口句柄,使係統不再進行頁麵拷貝,方法是使用下麵語句把窗口句柄設為共享: