通过其进程名称取消隐藏进程?

前一段时间我写了一个隐藏/恢复进程窗口的代码,我做的是这样的:

隐藏进程:

1)在正在运行的进程中查找进程名称。

2)将MainWindowHandle添加到Container(在本例中为Dictionary),稍后取消隐藏该过程是必要的。

3)使用ShowWindow API函数隐藏进程。

取消隐藏流程:

1)在正在运行的进程中查找进程名称。

2)从容器中检索指定进程的已保存MainWindowHandle。

3)使用ShowWindow API函数取消隐藏进程。

为什么我使用字典来取消隐藏进程?嗯,因为隐藏进程的MainWindowHandle值为0 ,所以这是我找到的唯一方法来检索在ShowWindow函数中使用的正确句柄来恢复进程。

但我真的不想依赖于Hide进程之前保存所需HWNDHide方法,我想通过指定进程名称知道如何在VB.NETC#中执行取消隐藏操作来改进这一切。 (例如: 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)  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 

码:

 using System.Diagnostics; using System.Runtime.InteropServices; [DllImport("User32")] private static extern int ShowWindow(IntPtr hwnd, int nCmdShow); [DllImport("User32.dll")] private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string strClassName, string strWindowName); [DllImport("user32.dll")] private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId); private const int SW_RESTORE = 9; private void UnhideProcess(string processName) //Unhide Process { IntPtr handle = IntPtr.Zero; int prcsId = 0; //an array of all processes with name "processName" Process[] localAll = Process.GetProcessesByName(processName); //check all open windows (not only the process we are looking) begining from the //child of the desktop, handle = IntPtr.Zero initialy. do { //get child handle of window who's handle is "handle". handle = FindWindowEx(IntPtr.Zero, handle, null, null); GetWindowThreadProcessId(handle, out prcsId); //get ProcessId from "handle" //if it matches what we are looking if (prcsId == localAll[0].Id) { ShowWindow(handle, SW_RESTORE); //Show Window return; } } while (handle != IntPtr.Zero); } 

如果有更多具有相同名称的实例,则可以使用变量,例如count ,并在if语句中将其递增

 int count = 0; if (prcsId == localAll[count].Id) { ShowWindow(handle, SW_RESTORE); count++; } 

FindWindowEx函数

FindWindowEx()Process.MainWindowHandle()之间的区别可能是每个函数都在寻找句柄。 与MainWindowHandle不同, FindWindowEx()无处不在。 进程句柄也被称为HANDLE ,窗口一被称为HWND

我为vb.net编写了这个解决方案,感谢@γηράσκωδ’αείπολλάδιδασκόμε

  Private Shared Function ShowWindow( ByVal hwnd As IntPtr, ByVal nCmdShow As Integer ) As Integer End Function  Private Shared Function FindWindowEx( ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal strClassName As String, ByVal strWindowName As String ) As IntPtr End Function  Private Shared Function GetWindowThreadProcessId( ByVal hWnd As IntPtr, ByRef ProcessId As Integer ) As Integer End Function Public Enum WindowState As Integer '''  ''' Hides the window and activates another window. '''  Hide = 0I '''  ''' Activates and displays a window. ''' If the window is minimized or maximized, the system restores it to its original size and position. ''' An application should specify this flag when displaying the window for the first time. '''  Normal = 1I '''  ''' Activates the window and displays it as a minimized window. '''  ShowMinimized = 2I '''  ''' Maximizes the specified window. '''  Maximize = 3I '''  ''' Activates the window and displays it as a maximized window. '''  ShowMaximized = Maximize '''  ''' Displays a window in its most recent size and position. ''' This value is similar to , except the window is not actived. '''  ShowNoActivate = 4I '''  ''' Activates the window and displays it in its current size and position. '''  Show = 5I '''  ''' Minimizes the specified window and activates the next top-level window in the Z order. '''  Minimize = 6I '''  ''' Displays the window as a minimized window. ''' This value is similar to , except the window is not activated. '''  ShowMinNoActive = 7I '''  ''' Displays the window in its current size and position. ''' This value is similar to , except the window is not activated. '''  ShowNA = 8I '''  ''' Activates and displays the window. ''' If the window is minimized or maximized, the system restores it to its original size and position. ''' An application should specify this flag when restoring a minimized window. '''  Restore = 9I '''  ''' Sets the show state based on the SW_* value specified in the STARTUPINFO structure ''' passed to the CreateProcess function by the program that started the application. '''  ShowDefault = 10I '''  ''' Windows 2000/XP: ''' Minimizes a window, even if the thread that owns the window is not responding. ''' This flag should only be used when minimizing windows from a different thread. '''  ForceMinimize = 11I End Enum Private Sub SetWindowState(ByVal ProcessName As String, ByVal WindowState As WindowState, Optional ByVal Recursivity As Boolean = False) If ProcessName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) Then ProcessName = ProcessName.Remove(ProcessName.Length - ".exe".Length) End If Dim pHandle As IntPtr = IntPtr.Zero Dim pID As Integer = 0I Dim Processes As Process() = Process.GetProcessesByName(ProcessName) ' If any process matching the name is found then... If Processes.Count = 0 Then Exit Sub End If For Each p As Process In Processes Do Until pID = p.Id ' Check all windows. ' Get child handle of window who's handle is "pHandle". pHandle = FindWindowEx(IntPtr.Zero, pHandle, Nothing, Nothing) ' Get ProcessId from "pHandle". GetWindowThreadProcessId(pHandle, pID) ' If the ProcessId matches the "pID" then... If pID = p.Id Then ShowWindow(pHandle, WindowState) If Not Recursivity Then Exit For End If End If Loop Next p End Sub