无法隐藏进程
Posted
技术标签:
【中文标题】无法隐藏进程【英文标题】:cannot hide process 【发布时间】:2011-09-09 18:41:58 【问题描述】:我想启动 calc.exe 并隐藏它 但只能启动exe不能隐藏 我的代码有什么错误??
Imports System.Runtime.InteropServices
Imports System.IntPtr
Public Class Form1
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a As IntPtr = Process.GetProcessesByName("Calc")(0).Id
ShowWindowAsync(a, 0)
End Sub
End Class
【问题讨论】:
你甚至没有开始这个过程。显然,您只是尝试搜索现有流程并尝试显示。您应该开始一个新进程,获取窗口的 句柄(可能通过MainWindowHandle
属性),然后将该句柄传递给 ShowWindow[Async]()
函数。
我试过 a=process.start("calc").handle 之后我将 a 传递给 showwindows,但它仍然没有工作。它只能运行calc,但不能隐藏它
隐藏 calc.exe 应用程序的目的是什么?为什么要隐藏它?如果它被隐藏了,任何人将如何使用该应用程序
【参考方案1】:
我之前做过一个sn-p,它适用于任何进程,是两个通用函数,还具有递归模式并且易于使用:
#Region " Hide-Restore Process "
' [ Hide-Restore Process Function ]
'
' // By Elektro H@cker
'
' Examples :
'
' Hide_Process(Process.GetCurrentProcess().MainModule.ModuleName, False)
' Hide_Process("notepad.exe", False)
' Hide_Process("notepad", True)
'
' Restore_Process(Process.GetCurrentProcess().MainModule.ModuleName, False)
' Restore_Process("notepad.exe", False)
' Restore_Process("notepad", True)
Dim Process_Handle_Dictionary As New Dictionary(Of String, IntPtr)
<System.Runtime.InteropServices.DllImport("User32")> Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As Int32) As Int32
End Function
Private Sub Hide_Process(ByVal Process_Name As String, Optional ByVal Recursive As Boolean = False)
If Process_Name.ToLower.EndsWith(".exe") Then Process_Name = Process_Name.Substring(0, Process_Name.Length - 4)
Dim proc() As Process = Process.GetProcessesByName(Process_Name)
If Recursive Then
For proc_num As Integer = 0 To proc.Length - 1
Try
Process_Handle_Dictionary.Add(Process_Name & ";" & proc(proc_num).Handle.ToString, proc(proc_num).MainWindowHandle)
ShowWindow(proc(proc_num).MainWindowHandle, 0)
Catch ex As Exception
' MsgBox(ex.Message) ' The handle already exist in the Dictionary
End Try
Application.DoEvents()
Next
Else
If Not proc.Length = 0 AndAlso Not proc(0).MainWindowHandle = 0 Then
Process_Handle_Dictionary.Add(Process_Name & ";" & proc(0).Handle.ToString, proc(0).MainWindowHandle)
ShowWindow(proc(0).MainWindowHandle, 0)
End If
End If
End Sub
Private Sub Restore_Process(ByVal Process_Name As String, Optional ByVal Recursive As Boolean = False)
If Process_Name.ToLower.EndsWith(".exe") Then Process_Name = Process_Name.Substring(0, Process_Name.Length - 4)
Dim Temp_Dictionary As New Dictionary(Of String, IntPtr) ' Replic of the "Process_Handle_Dictionary" dictionary
For Each Process In Process_Handle_Dictionary : Temp_Dictionary.Add(Process.Key, Process.Value) : Next
If Recursive Then
For Each Process In Temp_Dictionary
If Process.Key.ToLower.Contains(Process_Name.ToLower) Then
ShowWindow(Process.Value, 9)
Process_Handle_Dictionary.Remove(Process.Key)
End If
Application.DoEvents()
Next
Else
For Each Process In Temp_Dictionary
If Process.Key.ToLower.Contains(Process_Name.ToLower) Then
ShowWindow(Process.Value, 9)
Process_Handle_Dictionary.Remove(Process.Key)
Exit For
End If
Application.DoEvents()
Next
End If
End Sub
#End Region
【讨论】:
【参考方案2】:以下代码应该使用托管代码执行您想要的操作,但是当我使用 calc 尝试它时,它不会开始隐藏或最小化(其他 exe 按预期工作,所以它可能是 calc 的特殊之处?)
Dim procStartInfo As New ProcessStartInfo
Dim procExecuting As New Process
With procStartInfo
.FileName = "calc"
.WindowStyle = ProcessWindowStyle.Hidden
End With
procExecuting = Process.Start(procStartInfo)
【讨论】:
以上是关于无法隐藏进程的主要内容,如果未能解决你的问题,请参考以下文章