请问如何暂停CPU对某个进程进行处理,即如何将一个外部进程挂起?

解决方案 »

  1.   

    http://topic.csdn.net/t/20010309/17/81968.html
      

  2.   

    果然可以哈哈我试了下挂起winlogon以后不能重启了嘿嘿
      

  3.   

    我试了下有时候可以有时候不可以
    真是很奇怪代码如下
    模块代码
    Private Declare Function Thread32First Lib "kernel32.dll" (ByVal hSnapShot As Long, ByRef lpte As THREADENTRY32) As Boolean
    Private Declare Function Thread32Next Lib "kernel32.dll" (ByVal hSnapShot As Long, ByRef lpte As THREADENTRY32) As BooleanPublic Declare Function OpenThread Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Boolean, ByVal dwThreadId As Long) As Long
    Public Declare Function ResumeThread Lib "kernel32.dll" (ByVal hThread As Long) As Long
    Public Declare Function TerminateThread Lib "kernel32.dll" (ByVal hThread As Long, ByVal dwExitCode As Long) As Boolean
    Public Declare Function SuspendThread Lib "kernel32.dll" (ByVal hThread As Long) As LongPublic Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
    Public Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As LongPublic Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Type PROCESSENTRY32
        dwSize As Long
        cntUsage As Long
        th32ProcessID As Long
        th32DefaultHeapID As Long
        th32ModuleID As Long
        cntThreads As Long
        th32ParentProcessID As Long
        pcPriClassBase As Long
        dwFlags As Long
        szExeFile As String * 260
    End Type
    Public Type THREADENTRY32
        dwSize As Long
        cntUsage As Long
        th32ThreadID As Long
        th32OwnerProcessID As Long
        tpBasePri As Long
        tpDeltaPri As Long
        dwFlags As Long
    End TypePublic Const THREAD_SUSPEND_RESUME As Long = &H2Public ProcessId() As PROCESSENTRY32
    Public Thread() As THREADENTRY32Public Const LB_SETHORIZONTALEXTENT = &H194
    Public Const TH32CS_SNAPheaplist = &H1
    Public Const TH32CS_SNAPPROCESS = &H2
    Public Const TH32CS_SNAPthread = &H4
    Public Const TH32CS_SNAPmodule = &H8
    Public Const TH32CS_INHERIT = &H80000000
    Public Const TH32CS_SNAPall = (TH32CS_SNAPheaplist Or TH32CS_SNAPPROCESS Or TH32CS_SNAPthread Or TH32CS_SNAPmodule)Public Function Thread32_Enum(ByRef Thread() As THREADENTRY32, lProcessID As Long) As Long
    ReDim Thread(0)
    Dim THREADENTRY32 As THREADENTRY32
    Dim hSnapShot As Long
    Dim lThread As Long
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPthread, lProcessID)
    THREADENTRY32.dwSize = Len(THREADENTRY32)
    If Thread32First(hSnapShot, THREADENTRY32) = False Then
        Thread32_Enum = -1
        Exit Function
    Else
        ReDim Thread(lThread)
        Thread(lThread) = THREADENTRY32
    End IfDo
        If Thread32Next(hSnapShot, THREADENTRY32) = False Then
            Exit Do
        Else
            lThread = lThread + 1
            ReDim Preserve Thread(lThread)
            Thread(lThread) = THREADENTRY32
        End If
    Loop
    Thread32_Enum = lThread
    End Function窗口代码
    Private Sub Command1_Click()
    l = List2.ListCount
    If MsgBox("挂起整个进程将挂起所有的进程,确定要挂起??", vbDefaultButton2 + vbOKCancel + vbQuestion, "挂起进程") = vbOK Then
    For i = 0 To l - 1
        Thread_Suspend List2.List(i)
    Next
    End If
    End SubPrivate Sub Form_Load()
    TList
    End SubPrivate Sub List1_Click() '线程列表
    List2.Clear
    For i = 0 To Thread32_Enum(Thread(), ProcessId(List1.ListIndex).th32ProcessID)
        If Thread(i).th32OwnerProcessID = ProcessId(List1.ListIndex).th32ProcessID Then
            List2.AddItem Thread(i).th32ThreadID
        End If
    Next i
    End SubPrivate Sub List2_DblClick()
    PopupMenu Threads
    End SubPrivate Sub ResumeT_Click()
        If List2.Selected(i) Then
            Thread_Resume List2.List(List2.ListIndex)
        End If
    End SubPrivate Sub Suspend_Click()
        If MsgBox("挂起线程可能导致该程序出错,确定要挂起??", vbDefaultButton2 + vbOKCancel + vbQuestion, "挂起线程") = vbOK Then
            If List2.Selected(i) Then
                Thread_Suspend List2.List(List2.ListIndex)
            End If
        End If
    End Sub
    Function Thread_Suspend(T_ID As Long) As Long '挂起线程
    Dim hThread As Long
    hThread = OpenThread(THREAD_SUSPEND_RESUME, False, T_ID)
    Thread_Suspend = SuspendThread(hThread)
    End FunctionFunction Thread_Resume(T_ID As Long) As Long '恢复线程
    Dim hThread As Long
    Dim lSuspendCount As Long
    hThread = OpenThread(THREAD_SUSPEND_RESUME, False, T_ID)
    Thread_Resume = ResumeThread(hThread)
    End FunctionPublic Sub TList()
    Dim i As Integer
    Dim theloop As Long, snap As Long
    Dim Proc As PROCESSENTRY32
    List1.Clear  '清空内容
    List2.Clear
    snap = CreateToolhelp32Snapshot(TH32CS_SNAPall, 0) '获得进程"快照"的句柄
    Proc.dwSize = Len(Proc)
    theloop = Process32First(snap, Proc)  '获取第一个进程,并得到其返回值
        While theloop <> 0 '当返回值非零时继续获取下一个进程
            List1.AddItem Proc.szExeFile
            ReDim Preserve ProcessId(i)
            ProcessId(i).th32ProcessID = Proc.th32ProcessID
            ProcessId(i).cntThreads = Proc.cntThreads
            ProcessId(i).th32ParentProcessID = Proc.th32ParentProcessID
            i = i + 1
            theloop = Process32Next(snap, Proc)
        Wend
    CloseHandle snap '关闭进程"快照"句柄
    End Sub
      

  4.   

    //有时候可行有时候不可行不是吧?用你给我的代码可以将一般进程挂起,无法将系统进程挂起。我将权限提升到debug后,试了几次都无法关机了,至于“重启以后发现系统会变得启动很慢”我没遇过。
      

  5.   

    我头两次试验以后就不可以关机后来就可以还有你那个提升权限不是最高 因为还有个ring0 有部分杀毒软件结束不了
      

  6.   

    ring0权限好象不是那么好获得的,用AdjustTokenPrivileges可能无法获得哟
      

  7.   

    没问题的
    我怎么试都没办法关,而且开机也很快啊
    我再给你一篇文章
    http://www.csdn.net/develop/article/11/11776.shtm
      

  8.   

    aspower_(楼主做人要厚道 完事记得给分!我知道楼下就欣赏偶的分) 我怀疑是不你的机器上面有杀毒软件把挂起的进程又Resume了?
    我发那个连接之前试了好多次都没问题的
      

  9.   

    晕,那当然,我试过多次冻结后系统崩溃的~你要看看winlogon是多么关键的进程啊.....