許多程序都可以把自身的窗體設為最前顯示狀態,這個可以參考博客c#讓窗體永在最前 調用windows api 將窗體設為topmost。那么如何判斷桌面上的一個窗體是否為最前顯示狀態呢,不光是自己的程序,還包括其它程序。我們可以通過調用Windows Api的GetWindowLong方法判斷。
GetWindowLong是一個Windows API函數。該函數獲得有關指定窗口的信息,函數也獲得在額外窗口內存中指定偏移位地址的32位度整型值。
函數原型:LONG GetWindowLong(HWND hWnd,int nlndex);
參數說明:
hWnd:窗口句柄及間接給出的窗口所屬的窗口類。
nIndex:指定要獲得值的大於等於0的值的偏移量。有效值的范圍從0到額外窗口內存空間的字節數一4例如,若指定了12位或多於12位的額外類存儲空間,則應設為第三個32位整數的索引位8。要獲得任意其他值,指定下列值之一:
GWL_EXSTYLE(-20):獲得擴展窗口風格。
GWL_HINSTANCE(-6):獲得應用實例的句柄。
GWL_HWNDPARENT(-8):如果父窗口存在,獲得父窗口句柄。
GWL_ID(-12):獲得窗口標識。
GWL_STYLE(-16):獲得窗口風格。
GWL_USERDATA(-21):獲得與窗口有關的32位值。每一個窗口均有一個由創建該窗口的應用程序使用的32位值。
GWL_WNDPROC(-4):獲得窗口過程的地址,或代表窗口過程的地址的句柄。必須使用CallWindowProc函數調用窗口過程。
返回值:如果函數成功,返回值是所需的32位值;如果函數失敗,返回值是0。
代碼如下:
public class CheckTopMost
{
private const int WS_EX_TOPMOST = 0x00000008;
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
/// <summary>
/// 判斷窗口是否為TopMost
/// </summary>
/// <param name="hWnd"></param>
/// <returns></returns>
public static bool CheckIsTopMost(IntPtr hWnd)
{
int style = GetWindowLong(hWnd, WS_EX_TOPMOST);
style = style & WS_EX_TOPMOST;
if (style == WS_EX_TOPMOST)
{
return true;
}
return false;
}
}