5

データベースでそのアプリケーションのファントムサブスクライバーを取得できるように、アプリケーションを大まかに強制終了する必要があります(これはアプリケーションを閉じても生成できません)。手動で、タスクマネージャーからアプリケーションを強制終了すると、ファントムサブスクライバーが存在します。次に、VB6コードで自動的に実行する必要があります。ヘルプ!ありがとう。

4

8 に答える 8

7

2つの方法があります:

  1. WM_CLOSEウィンドウ(非表示/表示)がある場合は、ターゲットアプリケーションに送信します。タスクマネージャの「タスクの終了」はこの方法を使用します。ほとんどのアプリケーションはWM_CLOSEを処理し、正常に終了します。

  2. TerminateProcessAPIを使用して強制的に強制終了します-タスクマネージャーの「エンドプロセス」はこのメソッドを使用します。このAPIはプロセスを強制的に強制終了します。

例はここにあります:

VBヘルパー:ハウツー:プロセスをすぐに終了する

于 2009-09-04T11:26:06.843 に答える
5

vb6.0TaskKillを使用する

Private Sub Command1_Click()
Shell "taskkill.exe /f /t /im Application.exe"
End Sub
于 2016-05-17T04:46:18.460 に答える
3

TaskKillコマンドを使用してShellExecuteを呼び出します

TASKKILL[/Sシステム[/Uユーザー名[/P[パスワード]]]]{[/FIフィルター][/PIDプロセスID| /IMイメージ名]}[/T] [/ F]

説明:このツールは、プロセスID(PID)またはイメージ名でタスクを終了するために使用されます。

于 2009-09-04T11:27:51.737 に答える
3
Shell "taskkill.exe /f /t /im processname.exe"

これにより、processname.exe/fのイメージ名(/im)を使用したプロセスの終了()、およびそれによって開始された子プロセス()が強制され/tます。これらすべてのスイッチが必要なわけではありません。詳細については、taskkillコマンドヘルプを参照してください(コマンドラインで次のように入力します)。

taskkill/?
于 2009-09-04T15:26:22.170 に答える
1
Option Explicit

Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long


Private Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Target As String

'---------------------------------------------------------------------------------------
' Creation Date :   24/10/2005 09:03
' Created By    :   Jason Bruwer
' Purpose         :   Returns the windows handle of a window if you know the name
'                    :   E.g.
'                           Microsoft Word
'                           Microsoft Excel
'                           Microsoft PowerPoint
'                           Adobe Reader
' Updated By    :   [Initials] - [Date] - [Changes]
'---------------------------------------------------------------------------------------
Public Function GetWindowsHandle(WindowName As String, hWindow As Long) As Boolean

    On Error GoTo Errors

    ' Get the target's window handle.
    hWindow = FindWindow(vbNullString, WindowName)

    If hWindow = 0 Then GoTo Cheers

    GetWindowsHandle = True

Cheers:
    Exit Function
Errors:
    frmMain.LogErrorAcrossUsingRBT ("GetWindowsHandle")
    GoTo Cheers
End Function


'---------------------------------------------------------------------------------------
' Creation Date :   24/10/2005 09:03
' Created By    :   Jason Bruwer
' Purpose        :   Enumerates all the currently open windows and searches for an application
'                        with the specified name.
' Updated By    :   [Initials] - [Date] - [Changes]
'---------------------------------------------------------------------------------------
Public Function TerminateTask(app_name As String) As Boolean

On Error GoTo Errors

Target = UCase(app_name)
EnumWindows AddressOf EnumCallback, 0

TerminateTask = True

Cheers:
Exit Function
Errors:
frmMain.LogErrorAcrossUsingRBT ("TerminateTask")
GoTo Cheers
End Function


'---------------------------------------------------------------------------------------
' Creation Date :   24/10/2005 09:04
' Created By    :   Jason Bruwer
' Purpose         :  Checks to see if this is the window we are looking for and then trys
'                        to kill the application
' Updated By    :   [Initials] - [Date] - [Changes]
'---------------------------------------------------------------------------------------
Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
Dim buf As String * 256
Dim title As String
Dim length As Long

' Get the window's title.
length = GetWindowText(app_hWnd, buf, Len(buf))
title = Left$(buf, length)

'If title <> "" Then Debug.Print title

' See if this is the target window.
If InStr(UCase(title), Target) <> 0 Then
    ' Kill the window.
    If Not KillProcess(app_hWnd) Then Exit Function
End If

' Continue searching.
EnumCallback = 1

End Function


'---------------------------------------------------------------------------------------
' Creation Date :   24/10/2005 09:06
' Created By    :   Jason Bruwer
' Purpose         :  Trys to kill an application by using its windows handle
' Updated By    :   [Initials] - [Date] - [Changes]
'---------------------------------------------------------------------------------------
Public Function KillProcess(hWindow As Long) As Boolean
Dim RetrunValue As Long
Dim ProcessValue As Long
Dim ProcessValueID As Long
Dim ThreadID As Long

    On Error GoTo Errors

    If (IsWindow(hWindow) <> 0) Then
      ThreadID = GetWindowThreadProcessId(hWindow, ProcessValueID)

      If (ProcessValueID <> 0) Then
        App.LogEvent "Warning...killing orphan process..."

        ProcessValue = OpenProcess(PROCESS_ALL_ACCESS, CLng(0), ProcessValueID)
        RetrunValue = TerminateProcess(ProcessValue, CLng(0))
        CloseHandle ProcessValueID
      End If

    End If

    KillProcess = True

Cheers:
    Exit Function
Errors:
    frmMain.LogErrorAcrossUsingRBT ("KillProcess")
    GoTo Cheers
End Function
于 2009-09-04T11:36:37.087 に答える
1

Karl PetersonのVB6コードの優れたアーカイブには、高品質のサンプルコードと、WM_CLOSEとTerminateProcessの両方を使用した完全な説明があります。代替品を受け入れないでください!

多くのコードで見られる可能性のある落とし穴の1つは、WM_CLOSEを単一のウィンドウハンドルに送信するだけでは不十分であるということです。ほとんどのアプリケーションは多数のウィンドウで構成されています。Karlのコードに実装されている答え:このアプリケーションに属するすべてのトップレベルウィンドウを見つけて、それぞれにメッセージを送信します。

于 2009-09-04T12:22:45.557 に答える
0

これが名前でプロセスを強制終了するvb6の私のコードです

わたしにはできる

 Private Sub TerminateProcess(ProcessName As String)
        Dim Process As Object
        For Each Process In GetObject("winmgmts:").ExecQuery("Select Name from Win32_Process Where Name = '" & ProcessName & "'")
            Process.Terminate
        Next
End Sub
于 2019-07-16T04:30:51.897 に答える
0

VB6内部の方法でこれを行う...

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Sub KillProcess(ByVal processName As String)
       Set oWMI = GetObject("winmgmts:")
       Set oServices = oWMI.InstancesOf("win32_process")
       For Each oService In oServices
           servicename = LCase(Trim(CStr(oService.Name) & ""))
           If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
              oService.Terminate
           End If
       Next
End Sub

...そしてそれを次のように使用します:

killProcess("notepad.exe")

2番目のオプション: [シェル外部の方法で... ]

Shell "taskkill.exe /f /t /im notepad.exe"
于 2020-05-04T15:45:12.833 に答える