cannot hide process
i want to start calc.exe and hide it
but only can start the exex but cant hide what error in my code??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 B开发者_运维知识库oolean
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
The following code should do what you want using managed code, but when I tried it using calc it would not start hidden or minimized (other exe's worked as expected so it may be something peculiar with calc?)
Dim procStartInfo As New ProcessStartInfo
Dim procExecuting As New Process
With procStartInfo
.FileName = "calc"
.WindowStyle = ProcessWindowStyle.Hidden
End With
procExecuting = Process.Start(procStartInfo)
I did time ago a snippet which works with any proccess, are two generic functions and also has recursive mode and is easy to use:
#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
精彩评论