【发布时间】:2014-09-21 16:17:13
【问题描述】:
前段时间我写了一个代码来隐藏/恢复一个进程窗口,我做的是这样的:
隐藏进程:
1) 在正在运行的进程中查找进程名。
2) 将 MainWindowHandle 添加到容器(在本例中为字典),这对于稍后取消隐藏该过程是必要的。
3) 使用 ShowWindow API 函数隐藏进程。
取消隐藏进程:
1) 在正在运行的进程中查找进程名。
2) 从容器中取出指定进程保存的MainWindowHandle。
3) 使用 ShowWindow API 函数取消隐藏进程。
为什么我使用字典来取消隐藏进程?嗯,因为隐藏进程的 MainWindowHandle 值为零 0,所以这是我发现检索正确句柄以在ShowWindow函数恢复进程。
但我真的不想依赖Hide 方法在隐藏进程之前保存所需的HWND,我想通过知道如何执行取消隐藏操作来改进这一切在 VB.NET 或 C# 中仅通过指定进程名称(例如:cmd.exe)而不在 MainWindowHandle 之前保存,这是可以吗?
我展示了代码(在 VB.NET 中),让您了解我为 HideProcess 方法做了什么:
但请注意,此代码在问题中并不完全相关,我的问题是如何仅通过指定进程名称来取消隐藏隐藏进程以避免下面编写的代码需要检索保存句柄以取消隐藏进程。
' Hide-Unhide Process
'
' Usage Examples :
'
' HideProcess(Process.GetCurrentProcess().MainModule.ModuleName)
' HideProcess("notepad.exe", Recursivity:=False)
' HideProcess("notepad", Recursivity:=True)
'
' UnhideProcess(Process.GetCurrentProcess().MainModule.ModuleName)
' UnhideProcess("notepad.exe", Recursivity:=False)
' UnhideProcess("notepad", Recursivity:=True)
Private ProcessHandles As New Dictionary(Of String, IntPtr)
<System.Runtime.InteropServices.DllImport("User32")>
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer
End Function
Private Sub HideProcess(ByVal ProcessName As String, Optional ByVal Recursivity As Boolean = False)
If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then
ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length)
End If
Dim Processes() As Process = Process.GetProcessesByName(ProcessName)
Select Case Recursivity
Case True
For Each p As Process In Processes
ProcessHandles.Add(String.Format("{0};{1}", ProcessName, CStr(p.Handle)), p.MainWindowHandle)
ShowWindow(p.MainWindowHandle, 0)
Next p
Case Else
If Not (Processes.Count = 0) AndAlso Not (Processes(0).MainWindowHandle = 0) Then
Dim p As Process = Processes(0)
ProcessHandles.Add(String.Format("{0};{1}", ProcessName, CStr(p.Handle)), p.MainWindowHandle)
ShowWindow(p.MainWindowHandle, 0)
End If
End Select
End Sub
Private Sub UnhideProcess(ByVal ProcessName As String, Optional ByVal Recursivity As Boolean = False)
If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then
ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length)
End If
Dim TempHandles As New Dictionary(Of String, IntPtr)
For Each Handle As KeyValuePair(Of String, IntPtr) In ProcessHandles
TempHandles.Add(Handle.Key, Handle.Value)
Next Handle
For Each Handle As KeyValuePair(Of String, IntPtr) In TempHandles
If Handle.Key.ToLower.Contains(ProcessName.ToLower) Then
ShowWindow(Handle.Value, 9)
ProcessHandles.Remove(Handle.Key)
If Recursivity Then
Exit For
End If
End If
Next Handle
End Sub
【问题讨论】:
-
请在重新标记之前阅读我在问题中所说的话:'我想通过了解如何在 VB.NET 或 C# 中执行取消隐藏操作来改进这一切'
-
您的问题很广泛。基本上,您是在询问如何做某事,并希望有人能提供完整的工作代码。如果你有一个实际问题,你应该说明它是什么。
-
我在哪里要求完整代码?,不,我是在要求信息,另外,我提供了自己的代码来演示工作代码,对您来说还不够吗?由于不知道他自己的问题的解决方案,您对需要帮助的 OP 有什么期望?,这个讨论看起来很荒谬,真的,很抱歉,但是......我尽力了。
标签: c# vb.net winforms winapi process