把所有的应用程序名添加到combo里

解决方案 »

  1.   

    用API可以,这方面文章很多,可以去翻翻看,这个代码是我存起来的一段,其中提升权限的API和函数你用不到,可以去了。你稍加修改,把里面LIST.ADDITEM改成COMBOX的ADDITEM就可以了
    测试代码需要一个FRM,2个LISTVIEW(MS WINDOWS COMMON CONTROLS 6.0里面的),4个按钮,名称默认
    Option Explicit
    '======================用于查找进程和终止进程的API函数常数定义=====================
    Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
    Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Const MAX_PATH As Integer = 260
    Private 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 * MAX_PATH
    End Type
    Const TH32CS_SNAPheaplist = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPthread = &H4
    Const TH32CS_SNAPmodule = &H8
    Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule
    '======================在WIN2000下提升本进程权限的API函数常数定义=====================
    Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Const TOKEN_ASSIGN_PRIMARY = &H1
    Const TOKEN_DUPLICATE = (&H2)
    Const TOKEN_IMPERSONATE = (&H4)
    Const TOKEN_QUERY = (&H8)
    Const TOKEN_QUERY_SOURCE = (&H10)
    Const TOKEN_ADJUST_PRIVILEGES = (&H20)
    Const TOKEN_ADJUST_GROUPS = (&H40)
    Const TOKEN_ADJUST_DEFAULT = (&H80)
    Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or _
    TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or _
    TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
    Const SE_PRIVILEGE_ENABLED = &H2
    Const ANYSIZE_ARRAY = 1
    Private Type LUID
    lowpart As Long
    highpart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    '程序加载
    Private Sub Form_Load()
    AdjustTokenPrivileges2000
    Me.Caption = "WINDOWS 进程管理器"
    Command1.Caption = "刷新"
    Command2.Caption = "终止进程"
    Command3.Caption = "退出"
    ListView1.ColumnHeaders.Clear
    ListView1.ColumnHeaders.Add , "a", "进程ID", 800
    ListView1.ColumnHeaders.Add , "b", "进程名", 4900
    ListView1.View = lvwReport
    Command1_Click '刷新进程列表
    End Sub
    '显示当前系统中全部进程
    Private Sub Command1_Click()
    Dim i As Long, lPid As Long
    Dim Proc As PROCESSENTRY32
    Dim hSnapShot As Long
    ListView1.ListItems.Clear '清空ListView
    hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) '获得进程“快照”的句柄
    Proc.dwSize = Len(Proc)
    lPid = ProcessFirst(hSnapShot, Proc) '获取第一个进程的PROCESSENTRY32结构信息数据
    i = 0
    Do While lPid <> 0 '当返回值非零时继续获取下一个进程
    ListView1.ListItems.Add , "a" & i, Proc.th32ProcessID & "(&H" & Hex(Proc.th32ProcessID) & ")" '将进程ID添加到ListView1第一列
    ListView1.ListItems("a" & i).SubItems(1) = Proc.szExeFile '将进程名添加到ListView1第二列
    i = i + 1
    lPid = ProcessNext(hSnapShot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息数据
    Loop
    CloseHandle hSnapShot '关闭进程“快照”句柄
    End Sub
    '终止指定进程
    Private Sub Command2_Click()
    Dim lPHand As Long, TMBack As Long
    If ListView1.SelectedItem.Text <> "" Then
    If MsgBox("确实要结束进程[" & ListView1.SelectedItem.SubItems(1) & "]吗?", vbYesNo) = vbYes Then
    lPHand = Val(ListView1.SelectedItem.Text)
    lPHand = OpenProcess(1&, True, lPHand) '获取进程句柄
    TMBack = TerminateProcess(lPHand, 0&) '关闭进程
    If TMBack <> 0 Then
    MsgBox ListView1.SelectedItem.SubItems(1) & "已经被终止!"
    Else
    MsgBox ListView1.SelectedItem.SubItems(1) & "不能被终止!"
    End If
    CloseHandle lPHand
    Command1_Click '刷新进程列表
    End If
    End If
    End Sub
    '退出本程序
    Private Sub Command3_Click()
    Unload Me
    End Sub
    '这个函数用于在WIN2000/XP/03/NT4+系统中,本进程提升权限
    Sub AdjustTokenPrivileges2000()
    Dim hdlProcessHandle As Long
    Dim hdlTokenHandle As Long
    Dim tmpLuid As LUID
    Dim tkp As TOKEN_PRIVILEGES
    Dim tkpNewButIgnored As TOKEN_PRIVILEGES
    Dim lBufferNeeded As Long
    Dim lP As Long
    hdlProcessHandle = GetCurrentProcess()
    lP = OpenProcessToken(hdlProcessHandle, TOKEN_ALL_ACCESS, hdlTokenHandle)
    lP = LookupPrivilegeValue("", "SeDebugPrivilege", tmpLuid)
    tkp.PrivilegeCount = 1
    tkp.Privileges(0).pLuid = tmpLuid
    tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    lP = AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
    End Sub
      

  2.   

    上面是用API实现的,如果你的程序用在2K/XP一上版本中,那么可以用以下代码:
    注意:使用前先添加引用:Microsoft WMI Scripting V1.X Library
    我电脑上的是1.2,现在的WMI版本一般都支持要用到的操作,添加你的版本即可
    具体代码:
    Option ExplicitDim objSWbemLocator  As New SWbemLocator
    Dim objSWbemServices  As SWbemServices
    Dim objSWbemObjectSet  As SWbemObjectSet
    Dim objSWbemObject  As SWbemObjectPrivate Sub GetPro()
    Dim i As Long, mReturn As Long, strNameOfUser
        Set objSWbemServices = objSWbemLocator.ConnectServer()  '连接到本机的WMI,返回一个对 SWbemServices 对象的引用
        Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Process")   '返回Win32_Process类名标识的所有实例
        Combo1.Clear
        For Each objSWbemObject In objSWbemObjectSet  '枚举每一个Win32_Process的实例
            Combo1.AddItem objSWbemObject.Name  '将进程名添加到LvProcess第二列
        Next
        Combo1.ListIndex = 0
    End SubPrivate Sub Form_Load()
    GetPro
    End Sub
      

  3.   

    哦, 对了,忘记说明了,测试上面代码需要一个COMBOX控件,名称默认
      

  4.   

    这个参考一下:
    模仿Windows任务管理器源代码
    http://www.mndsoft.com/blog/article.asp?id=51LC进程管理器
    http://www.mndsoft.com/blog/article.asp?id=211&keyword=%E7%AE%A1%E7%90%86%E5%99%A8进程指挥官--进程控制源代码
    http://www.mndsoft.com/blog/article.asp?id=202&keyword=%E8%BF%9B%E7%A8%8B
      

  5.   

    应用程序,,,那是窗口列表用与我后来提供的代码类似的代码就可以解决了用API也行,呵呵。API就是用FINDWINDOW了。比较简单,以下一是段代码:测试代码请在窗体上添加一个LISTBOX,一个CMD,LISTBOX名称默认,按钮名改为CWindow
    '以下是一个CMD的点击事件,CMD名称为CWindow
    Private Sub CWindow_Click()
      Dim l As Long
      
      List1.Clear
      '遍历所有的窗口
      l = EnumWindows(AddressOf EnumWindowsProc, 0)
    End Sub'以下在一个模块中,是一个回调
    Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
      Dim astr As String * 256
      Dim l As Long
      l = GetWindowText(hwnd, astr, Len(astr))  '得到窗口的标题
      If InStr(astr, " ") > 1 Then
        Form1.List1.AddItem astr
      End If
      EnumWindowsProc = True
    End Function
    '上面代码将显示所有的窗体,其中包含隐藏窗体,你可以把他们用代码过滤掉.
    '上面代码使用了回调的方法,也可以使用FINDWINDOWEX函数,这个函数可以指定查询起始的HWND,具体应用示例可以参考这里的部分代码,
    http://community.csdn.net/Expert/topic/4746/4746854.xml?temp=.3710901
    另外,用WMI也可以实现,我先写一下,一会给你回复
      

  6.   

    模組:
    Option ExplicitPublic Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPublic Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As LongPublic Const SW_HIDE = 0
    Public Const SW_SHOW = 5Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean    Dim S As String       ' 讀取 hWnd 的視窗標題
        S = String(80, 0)
        Call GetWindowText(hwnd, S, 80)
        S = Left(S, InStr(S, Chr(0)) - 1)
            ' 若視窗標題不為空字串,則顯示在 ListBox 之中
        If Len(S) > 0 Then Form1.List1.AddItem S
        EnumWindowsProc = True ' 表示繼續列舉 hWndEnd Function
    窗體:
    Private Sub Command2_Click()
        Dim i As Integer
        Dim hw As Long
        
        List1.Clear
        List2.Clear
        EnumWindows AddressOf EnumWindowsProc, 0& '測偵巳在執行的程序
        For i = 0 To List1.ListCount - 1
            hw = FindWindow(vbNullString, List1.List(i))
            If IsWindowVisible(ByVal hw) <> 0 Then
               List2.AddItem List1.List(i)
            End If
        Next i
       
    End Sub
    List2中的項目所有可見進程,與你的要求還是有些差別的