如何防止 Wine 添加文件关联?

Wine会自动添加特定的MIME类型和文件关联(例如为.ini文件添加notepad.exe)。已经有一个答案解释了如何移除这些关联。

但是怎样才能阻止Wine再次添加它们呢?

4个回答

禁用winemenubuilder.exe将完全阻止Wine劫持您的文件关联,但也会阻止其为新安装的软件创建菜单项,这可能是一种不希望的行为。更好的解决方案是:
  1. 删除现有的Wine劫持(参见Wine FAQ):

    rm -f ~/.local/share/mime/packages/x-wine*
    rm -f ~/.local/share/applications/wine-extension*
    rm -f ~/.local/share/icons/hicolor/*/*/application-x-wine-extension*
    rm -f ~/.local/share/mime/application/x-wine-extension* 
    
  2. 编辑/usr/share/wine/wine.inf文件(以root身份),找到[Services]部分:

    [Services]
    HKLM,%CurrentVersion%\RunServices,"winemenubuilder",2,"%11%\winemenubuilder.exe -a -r"
    ...
    

    并将其修改为:

    [Services]
    HKLM,%CurrentVersion%\RunServices,"winemenubuilder",2,"%11%\winemenubuilder.exe -r"
    ...
    

    (即启动winemenubuilder.exe时不带-a开关)。 这样可以防止在新用户账户(或使用新的WINEPREFIX)上更新文件关联。

  3. 以类似的方式编辑$WINEPREFIX/system.reg文件(如果存在)。将以下内容中的

    [Software\\Microsoft\\Windows\\CurrentVersion\\RunServices]
    "winemenubuilder"="C:\\windows\\system32\\winemenubuilder.exe -a -r"
    

    去掉-a开关。(默认情况下,WINEPREFIX=$HOME/.wine。)

这将防止葡萄酒窃取您首选的mimeapps,但winemenubuilder仍然会运行并为您的Windows软件创建方便的桌面快捷方式。

4对我来说,路径是/opt/wine-staging/share/wine/wine.inf。如果文件不在标准位置上,请运行locate wine.inf来查找它。 - Hi-Angel
谢谢。在删除了所有的WINE ~/.local/share/文件之后,我的桌面仍然检测到不存在的MIME类型,并阻止正确的图标显示。在调用update-mime-database ~/.local/share/mime/之后,问题终于解决了。 - Eric Duminil

来自http://wiki.winehq.org/FAQ

不想让Windows应用程序的安装程序更改文件类型关联、添加菜单项或创建桌面链接的用户可以禁用winemenubuilder.exe。有几种方法可以做到这一点:

  • 在 winecfg 中:在运行安装程序之前,先运行 winecfg。转到“Libraries”选项卡,将 winemenubuilder.exe 输入到“New overrides”框中(它不在下拉列表中)。点击“Add”,然后从“Existing overrides”框中选择它。点击“Edit”,从列表中选择“Disable”,然后点击“Apply”。

  • 注册表文件:如果您需要多次应用此设置(例如,每次重新创建 Wine 前缀时),这种方法可能更方便。创建一个以 .reg 为扩展名的文本文件(例如,disable-winemenubuilder.reg),其中包含以下内容:

    [HKEY_CURRENT_USER\Software\Wine\DllOverrides] 
    "winemenubuilder.exe"=""
    

    要应用此设置,请运行 regedit disable-winemenubuilder.reg

  • 环境变量:在运行安装程序时设置 WINEDLLOVERRIDES 环境变量,例如:

    WINEDLLOVERRIDES=winemenubuilder.exe=d wine setup.exe
    
禁用winemenubuilder.exe将导致Wine程序打印错误,表示找不到它(尽管这些错误似乎不会影响程序的运行)。
一个避免错误的替代方法是用一个什么都不做的程序来替换它。使用MinGW的gcc在wine下编译以下代码,并将可执行文件放置在 C:\Windows\System32\winemenubuilder.exe

  int main() { /* Do nothing */ return 0; }

然后按照上述相同的步骤进行操作,但将winemenubuilder.exe设置为"native"而不是"disable"。

好的。那对我来说意味着我需要创建前缀,安装我的应用程序,手动删除所有默认的 Wine 关联和菜单(我希望保留应用程序的关联),然后更改注册表键以防止每次更新 Wine 时重新添加这些关联,对吗? - mniess

由于这是Google上的第一个结果,Wine FAQ现在列出了新版本Wine的另一种方法。
“从wine-3.14开始,winecfg在桌面集成标签页上有一个“管理文件关联”复选框。勾选它将启用winemenbuilder创建文件关联,取消勾选则禁止该行为。”

2这可能应该是被接受的答案。话虽如此,对我来说不适用,因为我为每个安装的Windows应用程序创建一个新的WINEPREFIX。 - hackerb9
1我发现这个帖子是因为wine-5.0(Ubuntu 5.0-3ubuntu1)正在窃取我的xdg-mime桌面文件关联。这个选项没有被勾选,而且我只有一个wine前缀,所以我不认为它在这个版本中起作用。 - AveryFreeman

这是一个脚本,可以自动化Hi-Angel的答案中的步骤1和3,并可用于多个前缀。
#!/bin/bash
# Workaround for winemenubuilder bloating file associations by default

# Remove all existing associations
rm -f ~/.local/share/mime/packages/x-wine*
rm -f ~/.local/share/applications/wine-extension*
rm -f ~/.local/share/icons/hicolor/*/*/application-x-wine-extension*
rm -f ~/.local/share/mime/application/x-wine-extension*

# Disable winemenubuilder for all existing registries
# Replace ~/.bottles with your prefix/"bottle" directories
for sysreg in $(find ~/.wine ~/.bottles -name system.reg);
do
    sed -i 's/winemenubuilder.exe -a/winemenubuilder.exe/' $sysreg
done