• python之win32下,枚举进程,线程和线程对应的窗口的利用ctypes实现


    import ctypes
    import win32com.client
    import win32gui, win32api, pywintypes
    
    WMI = win32com.client.GetObject('winmgmts:')
    kernel32 = ctypes.windll.kernel32
    
    TH32CS_SNAPTHREAD = 0x00000004
    
    class THREADENTRY32(ctypes.Structure): 
        _fields_ = [
                  ("dwSize", ctypes.c_ulong), 
                  ("cntUsage", ctypes.c_ulong), 
                  ("th32ThreadID", ctypes.c_ulong), 
                  ("th32OwnerProcessID", ctypes.c_ulong), 
                  ("tpBasePri", ctypes.c_long), 
                  ("tpDeltaPri", ctypes.c_long), 
                  ("dwFlags", ctypes.c_ulong)] 
        
    
    def EnumerateThreads(processId):
        threadEntry = THREADENTRY32()
        
        threadList = []
        threadSnap = kernel32.CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, processId)
        if threadSnap is not None:
            threadEntry.dwSize = ctypes.sizeof(threadEntry)
            success = kernel32.Thread32First(threadSnap, ctypes.byref(threadEntry))
            if not success:
                print 'Failed getting first process.'
            
            while success:
                if threadEntry.th32OwnerProcessID == processId:
                    threadList.append(threadEntry.th32ThreadID)
                success = kernel32.Thread32Next(threadSnap, ctypes.byref(threadEntry))
            
            kernel32.CloseHandle(threadSnap)
        return threadList
    
    def EnumerateProcesses(processName):
        processList = WMI.ExecQuery("SELECT * FROM Win32_Process where name = '%s'"%processName)
        return processList
    
    
    def SearchWindowHandleIdIdByCaption(processName ,caption):
        processList = EnumerateProcesses(processName)
        for process in processList:
            for thread in EnumerateThreads(long(process.Handle)):
                windows = []
                win32gui.EnumThreadWindows(thread, lambda hwnd, resultList: resultList.append(hwnd), windows)
                for windowIdi in windows:
                    text = win32gui.GetWindowText(windowIdi) 
                    text = text.__str__()
                    caption = caption.__str__()
                    if caption in text:
                        return [windowIdi, process.Handle]
        return [None, None]
                        
  • 相关阅读:
    echarts设置y轴线的样式
    echarts基础配置信息?
    提高网站用户体验使网站更好发展的五大要点
    没有或很少有出站链接的网站存在致命的缺陷
    网络推广之百度知道推广技巧
    如何让百度3分钟内收录你的文章
    CSS强制换行
    如何提高网站在搜索引擎中的权重
    js闭包深入详解
    深入浅出之正则表达式
  • 原文地址:https://www.cnblogs.com/ankier/p/2874027.html
Copyright © 2020-2023  润新知