在 Windows 10 上检测 .NET 中的进程最小化状态 (VB/C#)
Detecting Process Minimised State in .NET (VB/C#) on Windows 10
我已经为此搜索了好几天,但似乎无处可寻。
现在出现了一个问题,因为我们已经将一些工程师转移到 Windows10。我们的一个应用程序允许为选定的服务器启动 RDP windows。现在看来,当最小化 RDP window 时,WinForms 中不会引发任何事件,这会导致表单被隐藏且从未取消隐藏的问题。
我已经为最初的问题找到了解决方案,但这个问题已经让位给了新的问题。
我需要查明 RDP window 是否处于最小化状态,以便我可以在应用程序的计时器滴答上标记它。
我已尝试使用所选进程的 MainWindowHandle 并尝试实施 IsIconic,但这似乎不再适用于 Windows10 进程。
任何帮助将不胜感激,因为我正在拔头发。
下面是我使用代码的方向,我完全偏离了吗?
Private Sub CheckMinimisedTimer_Tick(sender As Object, e As EventArgs) Handles CheckMinimisedTimer.Tick
Dim p As Process = Process.GetProcesses().Where(Function(x) x.MainWindowTitle = $"{Me.Text} RDP CLIENT").FirstOrDefault()
If p IsNot Nothing Then
Dim i As Boolean = p.MainWindowHandle
If Not i Then
Me.WindowState = FormWindowState.Minimized
End If
End If
End Sub
通过更多的挖掘和朋友的帮助找到了解决方案,似乎在 IsIconic 函数上封送 Bool 就成功了。
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Public Shared Function IsIconic(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Private Sub CheckMinimisedTimer_Tick(sender As Object, e As EventArgs) Handles CheckMinimisedTimer.Tick
Dim p As Process = Process.GetProcesses().Where(Function(x) x.MainWindowTitle = $"{Me.Text} RDP CLIENT").FirstOrDefault()
If p IsNot Nothing Then
Dim i As IntPtr = p.MainWindowHandle
If IsIconic(i) Then
Me.WindowState = FormWindowState.Minimized
End If
End If
End Sub
我已经为此搜索了好几天,但似乎无处可寻。 现在出现了一个问题,因为我们已经将一些工程师转移到 Windows10。我们的一个应用程序允许为选定的服务器启动 RDP windows。现在看来,当最小化 RDP window 时,WinForms 中不会引发任何事件,这会导致表单被隐藏且从未取消隐藏的问题。
我已经为最初的问题找到了解决方案,但这个问题已经让位给了新的问题。
我需要查明 RDP window 是否处于最小化状态,以便我可以在应用程序的计时器滴答上标记它。
我已尝试使用所选进程的 MainWindowHandle 并尝试实施 IsIconic,但这似乎不再适用于 Windows10 进程。
任何帮助将不胜感激,因为我正在拔头发。
下面是我使用代码的方向,我完全偏离了吗?
Private Sub CheckMinimisedTimer_Tick(sender As Object, e As EventArgs) Handles CheckMinimisedTimer.Tick
Dim p As Process = Process.GetProcesses().Where(Function(x) x.MainWindowTitle = $"{Me.Text} RDP CLIENT").FirstOrDefault()
If p IsNot Nothing Then
Dim i As Boolean = p.MainWindowHandle
If Not i Then
Me.WindowState = FormWindowState.Minimized
End If
End If
End Sub
通过更多的挖掘和朋友的帮助找到了解决方案,似乎在 IsIconic 函数上封送 Bool 就成功了。
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Public Shared Function IsIconic(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Private Sub CheckMinimisedTimer_Tick(sender As Object, e As EventArgs) Handles CheckMinimisedTimer.Tick
Dim p As Process = Process.GetProcesses().Where(Function(x) x.MainWindowTitle = $"{Me.Text} RDP CLIENT").FirstOrDefault()
If p IsNot Nothing Then
Dim i As IntPtr = p.MainWindowHandle
If IsIconic(i) Then
Me.WindowState = FormWindowState.Minimized
End If
End If
End Sub