注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨启示录

欢迎光临我的网店优优我心:http://uumyheart.taobao.com

 
 
 

日志

 
 

Python: 查找进程ID及映像名称  

2010-07-21 16:31:43|  分类: python学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#!/usr/bin/env python
# -*- coding: gb2312 -*-
#导入相关的模块
 
#-----------------------------获取当前进程信息函数---------------------------------
 
class _PROCESS_MEMORY_COUNTERS(Structure):
    _fields_ = [("cb", c_long),
                ("PageFaultCount", c_long),
                ("PeakWorkingSetSize", c_long),
                ("WorkingSetSize", c_long),
                ("QuotaPeakPagedPoolUsage", c_long),
                ("QuotaPagedPoolUsage", c_long),
                ("QuotaPeakNonPagedPoolUsage", c_long),
                ("QuotaNonPagedPoolUsage", c_long),
                ("PagefileUsage", c_long),
                ("PeakPagefileUsage", c_long)]
    def __init__(self, *args, **kw):
        super(_PROCESS_MEMORY_COUNTERS, self).__init__(*args, **kw)
        self.cb = sizeof(self)
 
def GetProcessInfo():
    #print "查询进程"
    arr = c_ulong * 256
    lpidProcess= arr()
    cb = sizeof(lpidProcess)
    cbNeeded = c_ulong()
    cbNeeded = c_ulong()
    hModule = c_ulong()
    count = c_ulong()
 
    #PSAPI.DLL
    psapi = windll.psapi
    #Kernel32.DLL
    kernel = windll.kernel32
    modname = c_buffer(30)
    PROCESS_QUERY_INFORMATION = 0x0400
    PROCESS_VM_READ = 0x0010
   
    #Call Enumprocesses to get hold of process id's
    psapi.EnumProcesses(byref(lpidProcess),
                        cb,
                        byref(cbNeeded))
 
    #Number of processes returned
    nReturned = cbNeeded.value/sizeof(c_ulong())
   
    pid = [i for i in lpidProcess][:nReturned]
    counters = _PROCESS_MEMORY_COUNTERS()
    for id in pid:
       
        #Get handle to the process based on PID
        hProcess = kernel.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, id)
        if hProcess:
            psapi.EnumProcessModules(hProcess, byref(hModule), sizeof(hModule), byref(count))
            psapi.GetModuleBaseNameA(hProcess, hModule.value, modname, sizeof(modname))
            b = "".join( [ i for i in modname if i != '\x00'] )
            #print b
            b0 = (b.lower()).split('.')       
            if b0[0] == "qq":
                print "qq"
                #AppInfo.app_pid['GPRS数据传输'] = id

            kernel.CloseHandle(hProcess)
 


函数里变量PID里保存的是进程的ID。
for循环是得到了每一个PID对应的映像名称b,注意b是字符串,对于系统进程,b的内容一般是没有问题的,如:
b = "smss.exe"  或  b = "svchost.exe"
但是对于一些应用程序,则得到的b的名称就有些奇怪了,如:
 b = "USBKeyTools.exexe.exe"  还有 b = "QQ.exexe.exe",
当然这中情况并不是总是出现,有些情况下会正常显示。
因此当你根据映像名称判断某程序是否运行时,不能单单只考虑b里面的内容正常的情况,最后我采用的方式如程序中紫色字体的所示。
 
b0 = (b.lower()).split('.')       
            if b0[0] == "qq":
                print "qq"
                #AppInfo.app_pid['GPRS数据传输'] = id

欢迎讨论python相关知识。
  评论这张
 
阅读(3967)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017