实际上,我自己编写了一个程序,将特定窗口的topmost
状态设置为 true 或 false 。
我通过导入 user32.dll
实现了这一点[DllImport("user32.dll")]
private static extern bool SetWindowPos(...);
现在我想知道是否有可能获得窗口状态并查看是否设置了topmost
并将其添加到Listview
中的项目中。
当然我可以在运行时执行此操作,具体取决于我执行的操作,但我的程序将不会一直打开,我不想保存数据。
我想要的是在listview
中看到之前是否设置了topmost
,而不是在buttonclick上设置 true / false 。取决于其州......
是否有类似GetWindowPos
的内容来获取特定窗口的topmost
状态?
答案 0 :(得分:0)
根据詹姆斯索普的评论,我解决了这个问题。
首先,我添加了所需的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
通过这种方式,我可以显示Window是否具有topmost
状态。