优化大师每天定点自动优化脚本

来源:互联网 发布:怎样获得淘宝优惠券 编辑:程序博客网 时间:2024/05/01 01:05
#coding=utf-8__author__ = 'Administrator'__doc__ = '''pythonwin中win32gui的用法本文件演如何使用win32gui来遍历系统中所有的顶层窗口,并遍历所有顶层窗口中的子窗口说明:0.因为电脑上安装杀毒软件,很慢,用360更慢,所以考虑用优化大师,但是优化大师点击太费劲了,所以写了本脚本1.原来消息发送全部调用的SendMessage,以为优化大师内部是独立的线程处理,  但并不是,所以避免等待,直接使用PostMessage2.自动清除。3.每天早上7点和中午1点开始自动清理'''#优化大师窗口信息YHDS_WINDOW_TITTLE = 'Wopti Utilities'YHDS_WINDOW_CLSNAME = 'TWomccMainForm'#常量CONST_YJYH = '一键优化'CONST_YJQL = '一键清理'CONST_DIALOG_CLASS = '#32770'CONST_STATIC_CLASS = 'Static'#设置DEBUG = Falseimport sysimport win32guiimport win32conimport timeimport subprocessfrom pprint import pprintfrom datetime import datetimeimport scheduleimport loggingimport psutildef gbk2utf8(s):    return s.decode('gbk').encode('utf-8')def get_window_attr(hWnd):    #中文系统默认title是gb2312的编码    title = win32gui.GetWindowText(hWnd)    title = gbk2utf8(title)    clsname = win32gui.GetClassName(hWnd)    return title,clsnamedef get_dialog_text(hWnd):    #获取对话框的内容信息    childs = get_child_windows(hWnd)    for h in childs:        r_title, r_name = get_window_attr(h)        if r_name != CONST_STATIC_CLASS:            continue        r_title = r_title.strip()        if len(r_title) > 0:            return r_title    return ''def get_top_dialogs():    '''    获取顶层的所有对话框    :return:    '''    hWndList = get_top_windows()    dialogs = []    for h in hWndList:        _, clsname = get_window_attr(h)        if clsname == CONST_DIALOG_CLASS:            dialogs.append(h)    return dialogsdef show_dialog():    '''    显示所有的对话框窗体    :param hWnd:    :return:    '''    show_windows(get_top_dialogs())def show_window_attr(hWnd):    '''    显示窗口的属性    :return:    '''    if not hWnd:        return    title,clsname = get_window_attr(hWnd)    print '窗口句柄:%s ' % (hWnd)    print '窗口标题:%s' % (title)    print '窗口类名:%s' % (clsname)    print ''def show_windows(hWndList):    for h in hWndList:        show_window_attr(h)def get_top_windows():    hWndList = []    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)    return hWndListdef demo_top_windows():    '''    演示如何列出所有的顶级窗口    :return:    '''    hWndList = get_top_windows()    show_windows(hWndList)    return hWndListdef get_child_windows(parent):    hWndChildList = []    win32gui.EnumChildWindows(parent, lambda hWnd, param: param.append(hWnd),  hWndChildList)    return hWndChildListdef demo_child_windows(parent):    '''    演示如何列出所有的子窗口    :return:    '''    if not parent:        return    hWndChildList = get_child_windows(parent)    show_windows(hWndChildList)    return hWndChildListdef find_window(hWnd,clsname = None, title = None):    if not clsname and not title:        return False    def notNoneCompare(l, r):        if not l:            return True        return l == r    r_title,r_clsname = get_window_attr(hWnd)    return notNoneCompare(clsname, r_clsname) and notNoneCompare(title, r_title)def find_window_from_list(hWndList, clsname = None, title = None):    for h in hWndList:        if find_window(h, clsname, title):            return hdef demo_win32gui():    hWndList = demo_top_windows()    assert len(hWndList)    parent = hWndList[20]    #这里系统的窗口好像不能直接遍历,不知道是否是权限的问题    hWndChildList = demo_child_windows(parent)    print('-----top windows-----')    pprint(hWndList)    print('-----sub windows:from %s------' % (parent))    pprint(hWndChildList)def wait_get_top_window(clsname = None, title = None):    if not clsname and not title:        #无效参数        return    while True:        hWndList = get_top_windows()        hWnd = find_window_from_list(hWndList, clsname= clsname, title= title)        print('---正在搜索--- %s' % (datetime.now()))        if hWnd:            return hWnd        #每间隔两秒钟查询一次        time.sleep(2)def get_window_by_title_filter(hWndList, nameFilter):    for h in hWndList:        r_title, r_name = get_window_attr(h)        #标题中包含过滤器的任何一项,则认为找到        for f in nameFilter:            if f in r_title:                return hdef autoYHDS():    #x坐标和y坐标分别是,窗口内的坐标    def click(hWnd, x, y):        #低位是x,高位是y        lParam = y << 15 | x        win32gui.PostMessage(hWnd, win32con.WM_LBUTTONDOWN, lParam)        win32gui.PostMessage(hWnd, win32con.WM_LBUTTONUP, lParam)    def get_center_pos(hWnd):        l, t, r, b = win32gui.GetWindowRect(hWnd)        x = (r - l) / 2        y = (b - t) / 2        return x,y    def click_window(hWnd):        x, y = get_center_pos(hWnd)        click(hWnd, x, y)    def click_and_do(hWnd, const_condition, work_name='Work', work = None):        print('开始%s...' % (work_name))        click_window(hWnd)        #等待任务执行完成        while True:            time.sleep(2)            r_title, _ = get_window_attr(hWnd)            if r_title == const_condition and win32gui.IsWindowEnabled(hWnd):                print('%s:完成' % (work_name))                return            print('正在%s,请等待...' % (work_name))            if work:                work()    def onekey_optimize(hWnd):        click_and_do(hWnd, CONST_YJYH, CONST_YJYH)    def get_ok_and_cancel(hWnd):        childs = get_child_windows(hWnd)        ok = get_window_by_title_filter(childs, ['确定','是'])        cancel = get_window_by_title_filter(childs, ['取消','否'])        assert ok and cancel        return ok, cancel    def onekey_clean_work():        dialogs = get_top_dialogs()        filter = ['Windows优化大师', '删除多个项目']        dialog = get_window_by_title_filter(dialogs, filter)        if dialog:            #根据对话框的类型来点击确定还是取消            ok, cancel = get_ok_and_cancel(dialog)            text = get_dialog_text(dialog)            if '注册表备份' in text:                click_window(cancel)            else:                click_window(ok)    def onekey_clean(hWnd):        click_and_do(hWnd, CONST_YJQL, CONST_YJQL, onekey_clean_work)        '''        print('开始一键清理...')        #点击开始执行一键清理操作        click_window(hWnd)        time.sleep(2)        #等待优化大师分析,等待分析结果        dialog = wait_get_top_window(clsname=CONST_DIALOG_CLASS, title='Windows优化大师')        ok, cancel = get_ok_and_cancel(dialog)        #点击确定删除扫描到的文件和文件夹        click_window(ok)        time.sleep(2)        #确定将所有的内容移动到垃圾箱        dialog = wait_get_top_window(clsname=CONST_DIALOG_CLASS, title='删除多个项目')        ok, cancel = get_ok_and_cancel(dialog)        assert ok and cancel        click_window(ok)        print('完成一键清理')        '''    def debug():        #dialog = get_onekey_clean_yhds()        #print dialog        #show_dialog()        dialogs = get_top_dialogs()        filter = ['Windows优化大师', '删除多个项目']        dialog = get_window_by_title_filter(dialogs, filter)        print get_dialog_text(dialog)        return    if DEBUG:        debug()    hWndList = get_top_windows()    yhds = find_window_from_list(hWndList, YHDS_WINDOW_CLSNAME, YHDS_WINDOW_TITTLE)    if not yhds:        print('优化大师应用程序未启动')        return    childs = get_child_windows(yhds)    yjyh = find_window_from_list(childs, None, CONST_YJYH)    yjql = find_window_from_list(childs, None, CONST_YJQL)    if not yjyh or not yjql:        print('找不到优化按钮')        return    onekey_optimize(yjyh)    onekey_clean(yjql)def start_YHDS():    p = subprocess.Popen('"E:\Program Files (x86)\Wopti\WoptiUtilities_CN.exe"')    print('启动优化大师')    h = wait_get_top_window(clsname=YHDS_WINDOW_CLSNAME, title=YHDS_WINDOW_TITTLE)    assert h    print 'PID=%d' % (p.pid,)    time.sleep(60)    return pdef job_clean():    #启动优化大师,优化完成后直接关闭    p = start_YHDS()    autoYHDS()    print('Kill PID=%d' % (p.pid,))    p.kill()if __name__ == '__main__':    reload(sys)    sys.setdefaultencoding('utf-8')    #每天早上的7点和中午的13点进行清理工工作    schedule.every().day.at("7:00").do(job_clean)    schedule.every().day.at("13:00").do(job_clean)    #事件循环    while True:        schedule.run_pending()        time.sleep(1)

1 0