Manjaro Linux下使用wine运行企业微信
Published on 2024-06-04 16:06 in 分类: 折腾 with 写python的叮叮叮
分类: 折腾

Manjaro Linux下使用wine运行企业微信

    开始

    因为工作原因所以必须用到企业微信,但是企业微信是目前主流办公软件中可能唯一一个不支持Linux系统的软件了,于是只能使用wine来运行windows版本来使用。期间遇到了各种坑在此记录一下,以便于能帮到同样需要的同学,也希望腾讯能够尽快开发Linux原生的企业微信。

    安装

    首先我们需要安装wine,其中wine的版本非常多,对于运行软件的影响也挺大。经过多次尝试,我发现其他版本的wine可能有缺字或者无字的现象,bug最少的是wine-staging版本,这是wine的一个分支,可以说是一个测试分支,可能包含有一些比较新的改动。同时可以装上wine的部分依赖。
    2024-06-06更新:
    缺字问题可能还是字体导致的,可以使用winetricks安装两个字体相关的包来解决。

    sudo pacman -S wine-staging wine-mono wine-gecko
    
    # 安装字体包解决字体问题
    winetricks corefonts
    winetricks fakechinese
    

    之后从企业微信官网下载最新版的企业微信的exe安装包,在文件管理器中打开,或者使用wine命令运行exe安装文件,安装完毕即可。

    配置

    首先我们从一台windows电脑的C:\\windows\Fonts目录打包复制过来,解压之后将里面所有的文件移动到~/.wine/drive_c/windows/Fonts下。这个操作主要是为了补充字体,防止出现字体问题。
    同时也从C:\\windows\sysytem32\DWrite.dll复制到~/.wine/drive_c/windows/system32/DWrite.dll,解决企微出现的Dwrite.dll错误

    然后我们使用wincfg命令打开wine的配置,做以下改动:

    • 首先windows版本那里,可以酌情进行更改。因为默认为windows 10的情况下企业微信的CEF(Chromium Embedded Framework)与wine的兼容性存在问题,会导致企业微信文档打开失败,并且出现libcef.dll的报错。如果你想在企业微信中使用企业微信文档,那么就将windows版本更改为windows xp到windows 8.1之间的版本,就可以正常的使用了。不过我这里考虑到其他问题,决定不更改这个配置,原因我们后面会讲到。
    • 然后在显示的选项卡中调节屏幕分辨率的滑块,这个实际上是会决定软件的缩放,高分屏推荐增大设置,我的2K笔记本是设置了192 dpi。.

    可选配置

    上面提到了我没有改动windows配置,其实原因很简单:企微文档因为使用了CEF所以实际上相当于打开了一个全新的chromium浏览器,其内存占用量相当可观,在打开几个文档之后可以上升到5G+,而且关闭文档之后该内存也不会被回收,最后可能会吃尽你的内存导致死机。
    但是当我们没有更改windows配置的时候,微信文档虽然无法使用但是会反复尝试重启,最后也会吃尽内存,所以现在我们需要做到的就是禁用企微里面的CEF模块,然后使用web端的企微文档来替代。
    首先我们打开终端,进入到企微的安装目录

    cd ~/.wine/drive_c/Program\ Files\ \(x86\)/WXWork
    

    然后进入到4.1.26.6014目录下,这个数字应该是版本号
    然后将这个目录下的compatible_web改名或者删除,个人建议改名,如果遇到某些情况改回来即可,无需重新安装。

    mv compatible_web compatible_web_bk
    

    之后企微的内存占用量会稳定在1.5G以下,虽然也不低但是比较稳定不会吃尽内存。这个内存占用应该还有优化的空间,应该跟企微某些组件启动失败后反复重试有关,windows上不开启企微文档的情况下内存占用只有200+MB。

    更新限制内存使用量

    经过了一些尝试我发现内存占用高的问题并不完全是因为企微组件的问题,而是企微本身的问题,比如我尝试将一些独立的有exe程序的组件改名掉,最后内存占用量也并没有低太多。并且在打开wincfg里面的虚拟桌面后,可以通过桌面开始菜单里面的运行taskmgr来开启wine里面的任务管理器,从里面可以看到还是企微的主程序主要占用来内存,所以通过禁用组件的方式来减少内存的使用不太可行,而且出现BUG的几率会变得更大。
    既然这条路走不通那就走简单直接一点的:直接限制这个进程能最多使用的内存量。经过一番查询之后发现可以使用systemd-run和cgroup这两种方式,systemd-run比较简单直接一条命令就可以了,而且在目前已经支持以用户权限运行,只要在参数最前面加上--user即可。
    所以总结下来就是下面的这条命令:

    systemd-run --user -p MemoryMax=256M --scope wine WXWork.exe
    

    运行这条命令之后,wine就会被限制在256M内存来运行企微。256M是有依据的,windows版本的企微在打开一段时间后(不使用企微文档的情况下)最高占用大约就是200+M,而wine本身也有一些其他的开销,所以最小可以定到256M,其实如果内存不是特别紧张的情况下,可以定到512M来缓解启动时候的卡顿。

    命令虽然已经有了,但是我们既然已经用了manjaro和KDE,那么肯定还是希望通过桌面的方式来运行。
    在终端里进入到~/.local/share/applications/wine,修改企微的desktop文件即可,我的最后修改完成的结果为:

    [Desktop Entry]
    Name=企业微信
    Exec=systemd-run --user -p MemoryMax=256M --scope wine C:\\\\ProgramData\\\\Microsoft\\\\Windows\\\\Start\\ Menu\\\\Programs\\\\企业微信\\\\企业微信.lnk
    Type=Application
    StartupNotify=true
    Path=/home/用户名/.wine/dosdevices/c:/Program Files (x86)/WXWork
    Icon=AF03_WXWork.0
    StartupWMClass=wxwork.exe
    

    这样就可以成功将企微的内存限制在比较合理的范围了,而且不需要root权限运行,除了启动的时候慢一些其他都相对正常。另外可以配合上面的windows配置使用,来控制企微文档使用的时候的内存占用。

    窗口阴影和置顶问题修复

    使用wine运行的企微的框体阴影因为无法正常渲染,所以会出现非常奇怪的一些图形BUG。由于微信和网易云音乐之前也出现过类似的问题,所以网上有不少解决方案,但是普遍不完全适用于新版的企微。因为大多数方案都是根据之前微信的阴影的窗口ID的后缀是固定的,来根据主窗口ID推算出阴影的窗口ID,但是新版的企微现在每次阴影的后缀都是不固定的,而且所有窗口都会出现一个阴影,所以就没办法完全用这种方案。

    不过这些教程给了我很大的启发,尤其是这位大神的文章。于是我比葫芦画瓢,尝试用窗口宽度白名单的方式过滤掉部分正常的窗口,写了一个python脚本来处理:

    #!/usr/bin/env python3
    
    import time
    import os
    import threading
    import time
    
    # 根据窗口的宽度来判断是否应该保留
    known_width_list = ['640','476','560','320','232']
    
    def kill_shadow():
        process_list = os.popen("ps -ef | grep WXWork.exe").readlines()
        if len(process_list) <= 1:
            return None
        current_window_list = os.popen("wmctrl -l -G -p -x").readlines()
        for current_window in current_window_list:
            if "wxwork.exe.wxwork.exe" not in current_window:
                continue
            info_list = current_window.split()
            window_id = info_list[0]
            if info_list[5] in known_width_list:
                continue
            # 长度为9的情况下就代表没有窗口标题
            if len(info_list) == 9:
                os.system("xdotool windowunmap " + window_id)
        # 置顶的右上角无法使用wmctrl获取到,只能通过xwininfo配合尺寸特征来定位
        xwininfo_list = os.popen('xwininfo -root -tree | grep wxwork.exe | grep "has no name"').readlines()
        for xwininfo in xwininfo_list:
            size_info = xwininfo.split()[6]
            width,height = size_info.split("+")[0].split("x")
            if int(height)< 100 and int(height) > 20 and int(width)/int(height)>30:
                os.system("xdotool windowunmap " + xwininfo.split()[0])
    
        threading.Timer(1, kill_shadow).start()
    
    kill_shadow()
    

    其中置顶部分的窗口之前很多人是采用判断窗口是否还在前台来自动最小化,但是在wayland中xdotool getactivewindow命令已经无法获取到前台窗口。而且winctrl也无法列出这个窗口,最后只能通过xwininfo -root -tree来列出所有窗口,再通过一些尺寸特征来筛选。所以有一定可能会出现误杀,但是从我现在正常使用来说基本没有太多误杀,如果出现误杀可以考虑拿到窗口宽度,放到known_width_list里面。
    总的来说这个方案在目前阴影ID后缀不固定的情况下,勉强采用窗口宽度来判断,所以每台机器都需要用xwininfo获取到正常窗口的宽度来自己适配,但是已经是wayland下对于新版企微比较好的解决办法了,后面到时候再看看能不能找一些其他更好的方案代替。

    最后

    最后我们就可以正常打开企微了。经过了这次对于wine下企微的问题处理,可以看出Linux可以说真的是相当强大,很多地方都可以自定义。当然如果以后所有的应用都能够有一份Linux原生版本就更好了,我期待这一天的到来。

    posted @   写python的叮叮叮  阅读(1457)  评论(8编辑  收藏  举报
    相关博文:
    阅读排行:
    · 使用C#创建一个MCP客户端
    · 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
    · ollama系列1:轻松3步本地部署deepseek,普通电脑可用
    · 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
    · 按钮权限的设计及实现
    点击右上角即可分享
    微信分享提示