使用Python3 + win32gui打开桌面应用,自动登录

1.场景:每天开机后都需要点开qq,pl/sql,idea,chrome等应用,觉得很麻烦,于是想到用python做一个程序,实现自动登录这些应用。
2.原理:就是实现 打开应用–等待窗口–点击按钮 这一流程,这边选择使用os+win32模块。本来想获取窗口句柄,然后获取按钮(子控件)的方式来实现点击的,但是发现个别应用只能获取到窗口句柄(spy++查看),无法遍历获取到子控件,所以统一使用像素坐标定位按钮,然后模拟鼠标移动和点击。所幸电脑分辨率1920*1080就是默认像素尺寸,并且以上应用打开后的位置固定(不固定也可以通过获取窗口句柄然后移动窗口来固定),所以按钮的像素坐标很好获取。
qq登录按钮位置,pl/sql取消按钮位置,idea第一个工程的位置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.代码

import os
import time
import win32gui
import win32api
import win32con


# 设置appdict
pyexe = "E:\...\python.exe"
appdict = {'qq': '"D:\...\QQScLauncher.exe"',
           'pl/sql': '"E:\...\plsqldev.exe"',
           'idea': '"E:...\idea64.exe"',
           'chrome': '"C:\...\chrome.exe"'}
# qq登录按钮位置,pl/sql取消按钮位置,idea第一个工程的位置
coorddict = {'qq': [960, 665], 'pl/sql': [1060, 620], 'idea': [700, 245]}
namedict = {'qq': 'QQ', 'pl/sql': 'Oracle Logon', 'idea': 'Welcome to IntelliJ IDEA'}


# 打开应用并且鼠标点击按钮(获取按钮的像素坐标很麻烦)
def open_by_grab():
    pyhd = win32gui.FindWindow(None, pyexe)  # 360会拦截pyexe,可以添加信任或者关闭360
    # 设置pyexe窗口属性和位置,太大会挡住一些窗口
    win32gui.SetWindowPos(pyhd, win32con.HWND_TOPMOST, 0, 0, 500, 500, win32con.SWP_SHOWWINDOW) 
    print("py exe 句柄: %s ..." % pyhd)
    for key in appdict.keys():
        print("启动 %s ..." % key)
        os.popen(r'%s' % appdict[key])  # os.system会阻塞
        time.sleep(3)
        if key == "chrome":
            pass
        else:
            winhd = win32gui.FindWindow(None, namedict[key])  # 根据窗口名获取句柄
            while winhd == 0:
                print("等待获取%s窗口 ..." % key)
                time.sleep(3)
                winhd = win32gui.FindWindow(None, namedict[key])
            print("获取%s窗口成功,开始登录 ..." % key)
            a, b = coorddict[key]
            mouse_click(a, b)
            time.sleep(3)
    print("完毕 ...")
    time.sleep(1)
    win32gui.SendMessage(pyhd, win32con.WM_CLOSE)


# 模拟鼠标点击
def mouse_click(a, b):
    time.sleep(1)
    win32api.SetCursorPos((a, b))
    time.sleep(1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # 360会拦截虚拟按键,可以添加信任或者关闭360
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)


open_by_grab()

4.使用bat调用py(没有py环境可以打包做成exe)
在这里插入图片描述
新建一个文本,增加调用py的命令,然后改成bat后缀:

start python "E:\...\openapp.py"

注意要在安全卫士添加信任,不然会拦截,很烦。
其他应用可以自行添加,也可以增加一些后续操作,或者对于pl/sql用获取句柄方式自动填用户密码然后点击确认登录…等等。
现在每天开机后点一下start.bat就可以玩手机了,美滋滋。

  • 20
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用`pywin32`库来实现对桌面实时画面的捕获。以下是一个简单的示例代码: ```python import win32gui import win32ui import win32con import win32api def capture_screen(): # 获取桌面窗口的句柄 hdesktop = win32gui.GetDesktopWindow() # 获取桌面窗口的尺寸 width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN) top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN) # 创建设备上下文对象 desktop_dc = win32gui.GetWindowDC(hdesktop) img_dc = win32ui.CreateDCFromHandle(desktop_dc) # 创建一个内存设备上下文对象,用于存储截图 mem_dc = img_dc.CreateCompatibleDC() # 创建一个位图对象,用于存储截图像素数据 screenshot = win32ui.CreateBitmap() screenshot.CreateCompatibleBitmap(img_dc, width, height) mem_dc.SelectObject(screenshot) # 将桌面窗口的画面拷贝到位图对象中 mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY) # 将位图对象转换为PIL图像对象 bmpinfo = screenshot.GetInfo() bmpstr = screenshot.GetBitmapBits(True) img = Image.frombuffer( 'RGB', (bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmpstr, 'raw', 'BGRX', 0, 1) # 清理资源 mem_dc.DeleteDC() win32gui.DeleteObject(screenshot.GetHandle()) img_dc.DeleteDC() win32gui.ReleaseDC(hdesktop, desktop_dc) return img ``` 这段代码使用`pywin32`库中的一些函数来获取桌面窗口的句柄和尺寸,并使用位图对象进行屏幕截图。最后将截图转换为PIL图像对象,你可以根据需要进行进一步处理或保存。 请确保你已经安装了`pywin32`和`Pillow`库,可以使用以下命令进行安装: ``` pip install pywin32 pip install Pillow ``` 希望这能帮助到你!如果还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值