Files
2026-08-27 11:22:54 -06:00

75 lines
1.3 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Windows.Forms;
namespace Crysome.Client.Util;
internal static class ClipboardSta
{
private static readonly BlockingCollection<Action> Queue;
private static readonly Thread Thread;
static ClipboardSta()
{
Queue = new BlockingCollection<Action>();
Thread = new Thread(Worker)
{
IsBackground = true,
Name = "CryClip"
};
Thread.SetApartmentState(ApartmentState.STA);
Thread.Start();
}
private static void Worker()
{
foreach (Action item in Queue.GetConsumingEnumerable())
{
try
{
item();
}
catch
{
}
}
}
public static string GetTextTruncated(int maxChars)
{
string[] box = new string[1];
ManualResetEventSlim done = new ManualResetEventSlim(initialState: false);
Queue.Add(delegate
{
try
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText() ?? "";
if (text.Length > maxChars)
{
text = text.Substring(0, maxChars) + "…";
}
box[0] = text;
}
else
{
box[0] = "";
}
}
catch
{
box[0] = "";
}
finally
{
done.Set();
}
});
done.Wait(3000);
return box[0] ?? "";
}
}