在 Windows 7 x64 上,当 Synergy 以服务模式运行时,无法从 Firefox 复制到剪贴板

在 Windows 7 x64 上,当 Synergy 以服务模式运行时,无法从 Firefox 复制到剪贴板

作为参考,我在 Windows 7 x64 上运行 Synergy 1.4.2 服务器,并带有一个 CentOS 5.5 Linux 客户端。大多数鼠标和键盘功能都按预期工作。以下是例外。

在某些情况下,从服务器到客户端的复制和粘贴会失败。在 Linux 客户端上完成的所有文本复制似乎都可以正常工作(我可以将文本粘贴到 Windows 中)。反之则不完全正确。以具有管理员权限的用户身份运行 Synergy 时,Windows 7 x64 服务器上的文本复制似乎可以从所有程序中工作(我可以成功地将复制的文本粘贴到任一机器上)。当将 Synergy 作为服务运行时(从 services.msc 启动),Windows 7 x64 服务器上的文本复制似乎可以从除 Firefox 之外的所有程序中工作。具体来说,在服务模式下,当我在 Firefox 中突出显示文本并执行以下任一操作时 (a) 编辑 -> 复制、(b) 右键单击​​ -> 复制或 (c) Control-C,我可以将文本粘贴到 Windows 7 服务器上的任何其他程序中,但无法将此文本粘贴到 Linux 客户端上。这仅有的使用 Firefox 时会发生这种情况。

作为一种解决方法(仍处于服务模式),我经常在记事本中打开一个文本文档。我从 Firefox 复制文本并成功将其粘贴到记事本中。然后我可以从记事本复制文本并成功将其粘贴到 Linux 客户端上。同样,除了 Firefox 之外的其他程序不会出现这种行为(即,我可以从 Google Chrome 中复制/粘贴而不会出现问题)。同样,这个问题仅有的当 Windows 7 x64 Synergy 服务器以服务模式启动时发生。

有其他人遇到过同样的现象吗?欢迎任何评论或建议。

答案1

我最近在一台新的 Windows 7 机器上也遇到了这个问题。在我的例子中,Linux 机器是服务器,而 Windows 7(和 XP)是客户端。我可以在 XP 和 Linux 之间进行双向复制和粘贴,而且从 Linux 复制到 Windows 7 中也可以。但我无法从 Windows 7 复制。我确实查看了调试消息,但没有什么特别之处,除了在离开 Windows 7 屏幕时根本看不到剪贴板消息。

在我看来,Synergy 服务无法读取剪贴板,这可能是 Windows 7 更新的安全模型的一部分。

我想我可以自信地说这是 Synergy 的一个错误,但希望它是一个容易修复的错误!(如果它变得足够烦人,我想我会自己尝试一下……)

答案2

我似乎遇到了同样的问题,我发现花时间调试和修复它(对我来说)很烦人。

症状是剪贴板中所有非纯文本条目似乎都被忽略了。这可以通过打开 MS Word 和剪贴板视图来很好地验证,因为那里的条目有一些小图标来标识条目的格式。

根据代码这应该不是问题,因为每个条目都有几种格式并且始终是纯文本 UTF-16 编码,这正是 Synergy 所期望的。

不幸的是,Synergy 试图通过 EnumClipboardFormats 枚举所有可用的条目格式,这应该也没有问题,但不知何故却出现了问题。我编写了一个简单的测试程序,这种方法没有问题。在 Synergy 中,EnumClipboardFormats 仅返回第一种格式,即纯文本的 CF_UNICODETEXT,其他格式则完全不同。与我的测试程序不同,在 Synergy 中,对 EnumClipboardFormats 的下一次调用返回错误 183 (ERROR_ALREADY_EXISTS),这毫无意义,也没有记录。

用下面的方法替换 CMSWindosClipboard::get 确实解决了这个问题。

CString
CMSWindowsClipboard::get(EFormat format) const
{
IMSWindowsClipboardConverter* converter = NULL;
for (ConverterList::const_iterator index = m_converters.begin();
                        index != m_converters.end(); ++index) {
    converter = *index;
    if (converter->getFormat() == format) {
        HANDLE win32Data = GetClipboardData(converter->getWin32Format());
        if (win32Data != NULL) 
            return converter->toIClipboard(win32Data);
    }
}

return CString();
}

答案3

这对我有用:http://tots.1o24.org/how-to-fix-copy-paste-clipboard-issue-on-windows-7-synergy-client/

客户端 Windows 7

服务器Linux

解决方案:在 Windows 7 客户端上禁用提升

相关内容