找回密码
 加入
搜索
查看: 4654|回复: 10

Au3调用wmi写进程管理器的问题

[复制链接]
发表于 2008-8-20 03:41:03 | 显示全部楼层 |阅读模式
很喜欢用au3,
在论坛逛了这么久,今天第一次发帖
有几个问题,被困扰几天了,连夜奋战的近乎痴狂,还是不知道怎么处理

图中是我写的一个多功能的工具。其中的一个页面。任务管理器


下面这个是在论坛看过某兄台截取tasklist获得相关信息的

修改代码后测试(原代码提示错误),发现对于我这么多页面的,速度会很慢,于是想到调用wmi获得信息

呵呵,第一次提问,我的问题就比较多
1,用WMI获取的进程路径,读取ExecutablePath的值,如图,发现有些进程的路径为空,请问,如何解决??
实在不想用截取tasklist的方法
可否用WMI列出进程后,再调用dll获得路径??
2.当我的鼠标选定一个listview item后(这里是进程),如何触发这个事件
例如:当我把鼠标放到某个进程上后,tooltrip鼠标所指进程名,这个怎么写?

..当我在explorer.exe上点击右键后,触发菜单上的命令,这个应该怎么写?
3.WMI列出进程后,怎么手动或自动刷新列表


OVer,
  希望哪位大侠能帮助我一下

[ 本帖最后由 忘忧含幽 于 2008-8-23 15:47 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2008-8-20 03:52:07 | 显示全部楼层

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#Include <Constants.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <GuiListView.au3> ;列表控件
#include <GuiTreeView.au3> ;树控件
#include <GuiStatusBar.au3> ;任务栏
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <Process.au3>;进程管理器必须
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#NoTrayIcon        ;不显示托盘
Opt("GUIOnEventMode", 1) ;事件驱动模式开启
;
$strComputer = "."        ;选定本机
$wbemServices = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")        ;连接到命名空间        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;任务管理器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Process=ProcessList()
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Tab_Process = GUICtrlCreateTabItem("任务管理器")
Dim $Process_Task=1        ;任务名
Dim $Process_Img=1        ;进程映像名
Dim $Process_PID=1        ;进程PID
Dim $Process_User=1        ;进程启动用户
Dim $Process_Mem=1        ;进程内存
Dim $Process_CPU_Time=1        ;进程CPU时间
Dim $Process_CPU_size=1        ;进程CPU百分比
Dim $Process_Level=1        ;进程级别
Dim $Process_Path=1        ;进程路径
Dim $Process_Module=1 ;进程所调用模块
Dim $Process_SVC=1         ;进程中的服务
Dim $Process_Status=1         ;任务状态,正在运行|没有响应
Dim $Process_Item
;$Process_List = Process_UpdateList()
$Process_List = GUICtrlCreateListView("任务|映像名称|PID|用户名|内存(KB)|CPU(%)|优先级|路径", 8, 32, 609, 353)
GUICtrlSetImage($Process_List, "shell32.dll",22,0);设置进程前的图标
$Pro_Menu=GUICtrlCreateContextMenu($Process_List) ;在进程列表窗口创建右键菜单
$Pro_Menu11= GUICtrlCreateMenuItem("刷新列表", $Pro_Menu)
$Pro_Menu12= GUICtrlCreateMenuItem("结束进程", $Pro_Menu)
$Pro_Menu13= GUICtrlCreateMenuItem("暂停进程", $Pro_Menu)
$Pro_Menu14= GUICtrlCreateMenuItem("删除文件(谨慎使用!)", $Pro_Menu)
$Pro_Menu15=GUICtrlCreateMenu("设置优先级",$Pro_Menu) ;在进程列表窗口创建右键子菜单,设置优先级
$Pro_Menu151= GUICtrlCreateMenuItem("实时", $Pro_Menu15)
$Pro_Menu152= GUICtrlCreateMenuItem("高", $Pro_Menu15)
$Pro_Menu153= GUICtrlCreateMenuItem("高于标准", $Pro_Menu15)
$Pro_Menu154= GUICtrlCreateMenuItem("标准", $Pro_Menu15)
$Pro_Menu155= GUICtrlCreateMenuItem("低于标准", $Pro_Menu15)
$Pro_Menu156= GUICtrlCreateMenuItem("低", $Pro_Menu15)
$Pro_Menuu_f1= GUICtrlCreateMenuItem("", $Pro_Menu)
$Pro_Menu21= GUICtrlCreateMenuItem("Google进程", $Pro_Menu)
$Pro_Menu22= GUICtrlCreateMenuItem("查看属性", $Pro_Menu)
$Pro_Menu23= GUICtrlCreateMenuItem("定位文件", $Pro_Menu)
$Pro_Menu24= GUICtrlCreateMenuItem("复制进程名", $Pro_Menu)
$Pro_Menu25= GUICtrlCreateMenuItem("复制进程路径", $Pro_Menu)
$Pro_Menuu_f2= GUICtrlCreateMenuItem("", $Pro_Menu)
$Pro_Menu31= GUICtrlCreateMenuItem("切换至", $Pro_Menu)
$Pro_Menu32= GUICtrlCreateMenuItem("前置窗口", $Pro_Menu)
$Pro_Menu33= GUICtrlCreateMenuItem("最小化窗口", $Pro_Menu)
$Pro_Menu34= GUICtrlCreateMenuItem("最大化窗口", $Pro_Menu)
$Pro_Menu_f3= GUICtrlCreateMenuItem("", $Pro_Menu)                ;右键菜单上的分隔符
$Pro_Menu41= GUICtrlCreateMenuItem("文件属性", $Pro_Menu)
$Pro_Menu42= GUICtrlCreateMenuItem("文件版本", $Pro_Menu)

$Process_UpdateList = GUICtrlCreateButton("刷新列表", 16, 389, 73, 25, 0)
$Process_SaveList = GUICtrlCreateButton("保存列表", 104, 389, 73, 25, 0)
$Process_Kill = GUICtrlCreateButton("结束进程", 200, 389, 73, 25, 0)
$Process_Query = GUICtrlCreateButton("查询进程", 312, 389, 73, 25, 0)
$Process_Print = GUICtrlCreateButton("截图", 520, 389, 57, 25, 0)
$Process_Copy = GUICtrlCreateButton("复制路径", 424, 389, 73, 25, 0)
GUICtrlSetBkColor(-1, 0x3A6EA5) 

$colProcesses = $wbemServices.ExecQuery ("Select * from Win32_Process") ;获取进程相关信息集合
        For $objProcess in $colProcesses
                $Process_Img=$objProcess.Name ;进程映像名
                $Process_PID=$objProcess.ProcessID
                $Process_Mem=$objProcess.WorkingSetSize
                $Process_Mem=$Process_Mem/1024
                ;$Process_Task=$objProcess.        ;任务名
                ;$objProcess.ThreadCount为user对象
                ;$objProcess.CommandLine为启动参数
                $Process_User=1        ;进程启动用户
                $Process_CPU_Time=1        ;进程CPU时间
                $Process_CPU_size=1        ;进程CPU百分比
                $Process_Level=1        ;进程级别
                $Process_Path=$objProcess.ExecutablePath        ;进程路径
                $Process_Module=1 ;进程所调用模块
                $Process_SVC=1         ;进程中的服务
                $Process_Item=GUICtrlCreateListViewItem( $Process_Task&"|"&$Process_Img&"|"&$Process_PID&"|"&$Process_User&"|"&$Process_Mem&"|"&$Process_CPU_Time&"|"&$Process_Level&"|"&$Process_Path,$Process_List)
next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2008-8-20 04:02:20 | 显示全部楼层
希望我把我的问题描述清楚了,哪位大侠能帮忙下,小弟感激不尽
 楼主| 发表于 2008-8-22 21:41:15 | 显示全部楼层
没人回答??
发表于 2008-8-22 21:42:23 | 显示全部楼层
感冒了。。。有精神了再帮你看。
 楼主| 发表于 2008-8-23 15:46:25 | 显示全部楼层
原帖由 sanhen 于 2008-8-22 21:42 发表
感冒了。。。有精神了再帮你看。



,恩,。等待居士的解答
发表于 2008-8-23 22:30:39 | 显示全部楼层
第一个问题。 在CMD 下用 WMIC 都没问题的啊。 估计VBS也是一样。
不过如果你要做任务管理器,不如用 cmdline 来的直观。  包括参数什么的都能显示出来
 楼主| 发表于 2008-8-25 19:28:03 | 显示全部楼层
原帖由 倚栏听风 于 2008-8-23 22:30 发表
第一个问题。 在CMD 下用 WMIC 都没问题的啊。 估计VBS也是一样。
不过如果你要做任务管理器,不如用 cmdline 来的直观。  包括参数什么的都能显示出来


主要是我不想从CMD截取进程列表,那样不仅内存占用大而且很慢
希望能用WMI解决我描述的问题

不过。还是谢谢你的回答
发表于 2009-8-30 16:29:33 | 显示全部楼层
感冒了。。。有精神了再帮你看。
sanhen 发表于 2008-8-22 21:42

这帖子08年的了,都一年了也没看到sanhen老大解决,或许私下解决了
发表于 2009-9-18 17:28:31 | 显示全部楼层
好贴,不顶不顶行
发表于 2010-1-4 22:07:30 | 显示全部楼层
#Include <GUIConstants.au3>
#notrayicon
dim $ListView1
GUICreate("简单的进程管理器", 257, 364)
$Button1 = GUICtrlCreateButton("结束进程", 8, 328, 105, 25)
$Button2 = GUICtrlCreateButton("刷新列表", 144, 328, 105, 25)
$ListView1 = list()
GUISetState(@SW_SHOW)
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
  ExitLoop
Case $msg = $Button1
  proclose()
Case $msg = $Button2
  $ListView1 = list()
EndSelect
WEnd
Exit

func list()
if $ListView1 then GUICtrlDelete($ListView1)
$list = ProcessList()
$ListView1 = GUICtrlCreateListView("进程名                              |PID      ", 8, 8, 241, 305)
for $i = 1 to $list[0][0]
  GUICtrlCreateListViewItem($list[$i][0]&"|"&$list[$i][1],$listview1)
next
return $ListView1
endfunc

func proclose()
$pro = stringsplit(GUICtrlRead(GUICtrlRead($listview1)),"|")
if $pro[0] = 2 then
  if ProcessExists($pro[2]) then ProcessClose($pro[2])  ;;runwait(@ComSpec & " /c taskkill /f /t /pid " & $pro[2],"",@sw_hide)
  else
   msgbox(4096,"错误","无法终止进程!")
  EndIf
  sleep(1000)
  if $pro[0] = 2 then
  if ProcessExists($pro[2]) then
  msgbox(4096,"错误","无法终止进程!")
  return
endif
endif
$ListView1 = list()
endfunc

这是我看到的一个源码,希望对你有用
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-28 09:58 , Processed in 0.168497 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表