如何在 c# 中获取每个窗口的“最顶层”状态

本文关键字:最顶层 状态 窗口 获取 | 更新日期: 2023-09-27 18:34:05

实际上我自己编写了一个程序,将特定窗口的topmost状态设置为

我通过导入用户32意识到了这一点.dll

[DllImport("user32.dll")]
private static extern bool SetWindowPos(...);

现在我想知道是否可以获取窗口的状态,看看是否设置了topmost并将其添加到我在Listview中的项目中。

当然,我可以在运行时执行此操作,具体取决于我执行的操作,但是我的程序不会一直打开,我不想以某种方式保存数据。

我想在listview中查看之前是否设置了topmost,而不是在单击按钮时将其设置为真/假。取决于其状态...

那么有没有类似GetWindowPos的东西来获取特定窗口的topmost状态?

如何在 c# 中获取每个窗口的“最顶层”状态

根据詹姆斯索普的评论,我是这样解决的。

首先,我添加了所需的dllconst

//Import DLL
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
//Add the needed const
const int GWL_EXSTYLE      = (-20);
const UInt32 WS_EX_TOPMOST = 0x0008;

在这一点上,我意识到当我想使用它的几个功能时,我必须再次添加 DLL。例如

[DllImport("user32.dll", SetLastError = true)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

我以为我可以这样写

[DllImport("user32.dll", SetLastError = true)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

注意:您不能这样做:D

在此之后,我转到刷新ListView的功能并像

//Getting the processes, running through a foreach
//...
//Inside the foreach
int dwExStyle    = GetWindowLong(p.MainWindowHandle, GWL_EXSTYLE);
string isTopMost = "No";
if ((dwExStyle & WS_EX_TOPMOST) != 0)
{
    isTopMost = "Yes";
}
ListViewItem wlv = new ListViewItem(isTopMost, 1);
wlv.SubItems.Add(p.Id.ToString());
wlv.SubItems.Add(p.ProcessName);
wlv.SubItems.Add(p.MainWindowTitle);
windowListView.Items.Add(wlv);
//Some sortingthings for the listview
//end of foreach processes

通过这种方式,我可以显示窗口是否具有topmost状态。