如何在 c# 中获取每个窗口的“最顶层”状态
本文关键字:最顶层 状态 窗口 获取 | 更新日期: 2023-09-27 18:34:05
实际上我自己编写了一个程序,将特定窗口的topmost
状态设置为真或假。
我通过导入用户32意识到了这一点.dll
[DllImport("user32.dll")]
private static extern bool SetWindowPos(...);
现在我想知道是否可以获取窗口的状态,看看是否设置了topmost
并将其添加到我在Listview
中的项目中。
当然,我可以在运行时执行此操作,具体取决于我执行的操作,但是我的程序不会一直打开,我不想以某种方式保存数据。
我想在listview
中查看之前是否设置了topmost
,而不是在单击按钮时将其设置为真/假。取决于其状态...
那么有没有类似GetWindowPos
的东西来获取特定窗口的topmost
状态?
根据詹姆斯索普的评论,我是这样解决的。
首先,我添加了所需的dll
和const
//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
状态。