上次在談到API處理表單的一些方法時,有個問題沒有解決,就是想在找到目標表單的前提下,讓目標表單和其它表單同時出現在案頭上,同時要保證只有目標表單是處於啟用狀態,也就是說只有目標表單可以接受到類比按鍵訊息。終於找到了,可以通過SetForwardWindow(int handle)方法將目標表單啟用並處於最前表單。同時利用另外一個API函數SetWindowPos來設定其他表單,使其可以同處案頭。下面就簡單介紹下這個方法:
static extern bool SetWindowPos( HWND hWnd, //視窗控制代碼
HWND hWndInsertAfter, //排列順序的控制代碼
int X, //水平座標
int Y, //垂直座標
int cx, //寬
int cy, //高
UINT uFlags //視窗定位標識
);其中
傳回值:
BOOL,如果傳回值非零表示成功,返回零表示失敗。錯誤資訊請參看GetLastError函數。
參數表:
參數 類型及說明
hwnd HWND,欲定位的視窗控制代碼
hWndInsertAfter HWND,置於hwnd前面的視窗控制代碼。這個參數必須是視窗的控制代碼或是下面的值之一: HWND_BOTTOM 將視窗置於其它所有視窗的底部
HWND_NOTOPMOST 將視窗置於其它所有視窗的頂部,並位於任何最頂部視窗的後面。如果這個視窗非頂部視窗,這個標記對該視窗並不產生影響
HWND_TOP 將視窗置於它所有視窗的頂部
HWND_TOPMOST 將視窗置於其它所有視窗的頂部,並位於任何最頂部視窗的前面。即使這個視窗不是使用中視窗,也維持最頂部狀態
x:
int,指定視窗新的X座標
Y:
int,指定視窗新的Y座標
cx:
int,指定視窗新的寬度
cy:
int,指定視窗新的高度
wFlags:
UINT,指定視窗狀態和位置的標記。這個參數使用下面值的組合: SWP_DRAWFRAME 圍繞視窗畫一個框
SWP_FRAMECHANGED 發送一條WM_NCCALCSIZE訊息進入視窗,即使視窗的大小沒有發生改變。如果不指定這個參數,訊息WM_NCCALCSIZE只有在視窗大小發生改變時才發送
SWP_HIDEWINDOW 隱藏視窗
SWP_NOACTIVATE 不啟用視窗
SWP_NOCOPYBITS 屏蔽用戶端區域
SWP_NOMOVE 保持當前位置(X和Y參數將被忽略)
SWP_NOOWNERZORDER 不改變所有視窗的位置和排列順序
SWP_NOREDRAW 視窗不自動重畫
SWP_NOREPOSITION 與SWP_NOOWNERZORDER標記相同
SWP_NOSENDCHANGING 防止這個視窗接受WM_WINDOWPOSCHANGING訊息
SWP_NOSIZE 保持當前大小(cx和cy會被忽略)
SWP_NOZORDER 保持視窗在列表的當前位置(hWndInsertAfter將被忽略)
SWP_SHOWWINDOW 顯示視窗
備忘:
如果設定了SWP_SHOWWINDOW或SWP_HIDEWINDOW標記,這個視窗不發生移動或改變大小。視窗成為最最上層視窗後,它的所有子視窗也會進入最頂級。一旦將其設為非最頂級,則它的所有子視窗也會轉為非最頂級。
程式中引用如下:
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWndInsertAfter,int X,int Y,int cx,int cy,uint uFlags);static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);static readonly IntPtr HWND_TOP = new IntPtr(0);const UInt32 SWP_NOSIZE = 0x0001;const UInt32 SWP_NOMOVE = 0x0002;const UInt32 SWP_NOZORDER = 0x0004;const UInt32 SWP_NOREDRAW = 0x0008;const UInt32 SWP_NOACTIVATE = 0x0010;const UInt32 SWP_FRAMECHANGED = 0x0020;const UInt32 SWP_SHOWWINDOW = 0x0040;const UInt32 SWP_HIDEWINDOW = 0x0080;const UInt32 SWP_NOCOPYBITS = 0x0100;const UInt32 SWP_NOOWNERZORDER = 0x0200;const UInt32 SWP_NOSENDCHANGING = 0x0400;const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;