单声道剪贴板修复

时间:2015-02-19 16:08:23

标签: c# winforms macos mono

我正在Visual Studio中开发一个可在Windows和MAC上运行的应用程序(在Mono framework 3.6.0上)。 MAC上有一些问题似乎无法解决:

  1. 复制/粘贴功能不起作用。我知道有人问:
  2.   

    Clipboard.GetText() always returns empty string in Mono on Mac

         

    NSPasteboard and MonoMac

    但我无法在Winforms中使用NSPasteboard。

    1. 应用程序GUI在MAC上非常缓慢。我有一个TabControl,当我切换标签时,有时来自另一个标签的控件保持并通过其他标签控件混合。对于可部署的应用程序来说非常糟糕 类似的错误报告:
    2.   

      http://lists.ximian.com/pipermail/mono-bugs/2010-December/107562.html

      这些问题有解决方法吗?

      感谢

1 个答案:

答案 0 :(得分:3)

以防其他人可能需要它,解决方案是使用pbcopy / pbpaste实现复制/粘贴。这是一个辅助类,可用于在OSX上复制/粘贴:

public class MacClipboard
{
    /// <summary>
    /// Copy on MAC OS X using pbcopy commandline
    /// </summary>
    /// <param name="textToCopy"></param>
    public static void Copy(string textToCopy)
    {
        try
        {
            using (var p = new Process())
            {

                p.StartInfo = new ProcessStartInfo("pbcopy", "-pboard general -Prefer txt");
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = false;
                p.StartInfo.RedirectStandardInput = true;
                p.Start();
                p.StandardInput.Write(textToCopy);
                p.StandardInput.Close();
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine(ex.Message);
        }


    }

    /// <summary>
    /// Paste on MAC OS X using pbpaste commandline
    /// </summary>
    /// <returns></returns>
    public static string Paste()
    {
        try
        {
            string pasteText;
            using (var p = new Process())
            {

                p.StartInfo = new ProcessStartInfo("pbpaste", "-pboard general");
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.Start();
                pasteText = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
            }

            return pasteText;
        }
        catch (Exception ex)
        {
            Trace.WriteLine(ex.Message);
            return null;
        }

    }
}

与xsel一样,MAC上无需额外安装。