我前段時間寫的代碼隱藏/恢復過程窗口,我做的事是這樣的:通過進程名稱取消隱藏進程?
要隱藏的過程:
1)在正在運行的進程查找進程名。 2)將MainWindowHandle添加到一個Container(在這種情況下是一個Dictionary),這將有必要稍後取消隱藏該進程。
3)使用ShowWindow API函數隱藏進程。
要取消隱藏進程:
1)在正在運行的進程查找進程名。
2)從容器中檢索保存的指定進程的MainWindowHandle。
3)使用ShowWindow API函數取消隱藏進程。
爲什麼我用字典來取消隱藏進程?好,因爲隱藏進程具有零0
的MainWindowHandle
值,所以這是我發現檢索正確的手柄在ShowWindow
使用的唯一途徑函數來恢復進程。
但我真的不希望依賴於Hide
方法hidding過程之前保存所需的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#中執行取消隱藏操作來改進這一切' – ElektroStudios 2014-09-21 16:19:50
您的問題很廣泛。基本上,你問的是如何做一些事情,並希望有人會給出完整的工作代碼。如果你有一個實際的問題,你應該說明它是什麼。 – 2014-09-21 16:22:13
我在哪裏要求完整的代碼?不,我要求提供信息,並且我提供了自己的代碼來演示有效的代碼,對您來說還不夠嗎?你希望從OP得到什麼更多的工作需要幫助,因爲不知道他自己的問題的解決方案?,這個討論看起來很荒謬,真的很抱歉,但是......我盡力了。 – ElektroStudios 2014-09-21 16:23:13