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

时间:2016-02-10 12:50:13

标签: c# user32

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

我通过导入 user32.dll

实现了这一点
[DllImport("user32.dll")]

private static extern bool SetWindowPos(...);

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

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

我想要的是在listview中看到之前是否设置了topmost,而不是在buttonclick上设置 true / false 。取决于其州......

是否有类似GetWindowPos的内容来获取特定窗口的topmost状态?

1 个答案:

答案 0 :(得分:0)

根据詹姆斯索普的评论,我解决了这个问题。

首先,我添加了所需的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

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