在linux上使用wine 安装微信避坑


  • wine 一般只支持32位,所以容器要使用”WINEARCH=wince2 wineboot" 将容器初始化为 32位,这里最好不要加WINEPREFIX参数以使用默认的路径,安装和命令行使用时都更加方 便。winetricks 是有图形界面的,配置和安装程序比较方便,顺便说在其中可以在库中 直接选择安装QQ,但是WeChat 在库中找不到。
  • wine 和 winetricks 在安装包时非常慢,最好在 terminal 中挂代理加速。
  • 系统选择Windows XP,微信选择3.2版本(不支持朋友圈),更高版本微信使用了很多新 技术,wine 中支持不好,程序易崩溃,另外它对装饰的刷新很快会造成输入框中的焦点 漂移,输入体验不好。
  • winetricks 安装 riched20 是必须的,用以解决输入框无法输入问题。
  • 无法输入还有可能是窗口无法获取焦点,需要根据Linux 窗口管理器配置修改 winecfg 显示配置页“允许窗口管理器控制窗口”。 一般不让窗口管理器装饰窗口,但让窗口管 理器管理窗口,这样的话焦点获取策略比较统一,如果无法获取焦点进行输入则主要检查 并修改窗口管理器设置即可。
  • 黑边框是由微信自身窗口装饰产生的, linux xdotool 自动化工具可以部分解决此问题, 但对于3.2以上微信版本,可能造成程序崩溃。网上的脚本可以去掉黑框,但有 BUG 。脚 本原理是在微信启动后将所有窗口名称为空的窗口关掉,这同时会造成右键或托盘图标菜 单、还有提示窗口会被误关。

于是改进的脚本如下,主要考虑是每个边框都有一个对应的内容窗口,并且两者中心重叠:

import os
import sys
import time
import getopt
from decimal import Decimal
def remove_shadow(app_class):
    wdlst=[]
    for wid in os.popen('xdotool search --onlyvisible --class ' + app_class).readlines():
        wdn = os.popen('xdotool getwindowname %s' % (wid[:-1],)).readline()[:-1]
        w={}
        for exp in os.popen('xdotool getwindowgeometry --shell %s '%(wid[:-1],)).readlines():
            k,v=exp.split('=')
            w[k]=Decimal(v)
        w['NAME']=wdn
        wdlst.append(w)

    #print(wdlst)
    wdlst.sort(key=lambda x:x['X'])
    n=len(wdlst)
    for i in range(n):
        w=wdlst[i]
        if w['NAME']!='':continue
        ow = None
        for j in range(i+1,n):
            ow=wdlst[j]
            if w['X']+w['WIDTH']/2==ow['X']+ow['WIDTH']/2 and \
               w['Y']+w['HEIGHT']/2==ow['Y']+ow['HEIGHT']/2 and \
               w['X']-ow['X']==w['Y']-ow['Y'] and \
               abs(w['X']-ow['X'])<=21 and \
               ow['NAME'] !='':
                os.system('xdotool windowunmap %s' % w['WINDOW'])
                break

def check_app_running(app_exe):
    result = os.popen(
        "ps -ef |grep %s |grep -v 'grep' | awk '{print \"/proc/\"$2\"/cwd\"}' | xargs ls -l | grep drive_c" % app_exe).readlines()
    return len(result) > 0


def handle(app_exe, app_class):
    check_app_alive_max_count = 0
    while True:
        running = check_app_running(app_exe)
        if running:
            remove_shadow(app_class)
            check_app_alive_max_count = 0
        else:
            check_app_alive_max_count = check_app_alive_max_count + 1
            if check_app_alive_max_count > 30:  # 三十次没有检测程序启动,退出
                exit()
        time.sleep(1)  # 休眠1秒


if __name__ == '__main__':
    opts, args = getopt.getopt(sys.argv[1:], "e:c:", ["exe=", "class="])
    exe_name = None
    app_class = None
    for opt_name, opt_value in opts:
        if opt_name in ('-e', '--exe'):
            exe_name = opt_value
        elif opt_name in ('-c', '--class'):
            app_class = opt_value
    if exe_name is not None and app_class is not None:
        handle(exe_name, app_class)

创建一个启动脚本,并加入desktop

#!/bin/bash
export WINEPREFIX="/home/paul/.wine" 
wine C:\\\\users\\\\Public\\\\Desktop\\\\微信.lnk
python3 ./clrmap.py --exe=WeChat --class=wechat 2>&1

posted on 2022-07-31 16:13  YourTech-WuPeng  阅读(1745)  评论(0编辑  收藏  举报

导航