问题

Winform窗体,在首次应用剪切板性能时会呈现页面闪动。

起因

应用了PresentionCore.dll里的Clipboard导致的,具体起因未知

解决

应用其余办法进行剪切板性能,比方WindowAPI,Forms的Clipboard

演示代码

MyClipboard.cs

using System;using System.Runtime.InteropServices;namespace WindowsFormsApp2{    class MyClipboard    {        [DllImport("User32")]        public static extern bool OpenClipboard(IntPtr hWndNewOwner);        [DllImport("User32")]        public static extern bool CloseClipboard();        [DllImport("User32")]        public static extern bool EmptyClipboard();        [DllImport("User32")]        public static extern bool IsClipboardFormatAvailable(int format);        [DllImport("User32")]        public static extern IntPtr GetClipboardData(int uFormat);        [DllImport("User32", CharSet = CharSet.Unicode)]        public static extern IntPtr SetClipboardData(int uFormat, IntPtr hMem);        public static void FormsCopy()        {            System.Windows.Forms.Clipboard.SetDataObject("Forms");        }        public static void PresentationCoreCopy()        {            System.Windows.Clipboard.SetDataObject("PresentationCore");        }        public static void Win32Copy()        {            if (!OpenClipboard(IntPtr.Zero))            {                return;            }            EmptyClipboard();            SetClipboardData(13, Marshal.StringToHGlobalUni("Win32"));            CloseClipboard();        }    }}

Form1.cs

using System;using System.Collections;using System.Collections.Concurrent;using System.Configuration;using System.IO;using System.Text;using System.Windows.Forms;using System.Text.RegularExpressions;using System.Diagnostics;using System.Drawing;using System.Threading;namespace WindowsFormsApp2{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            this.WindowState = FormWindowState.Normal;        }        private void button1_Click(object sender, EventArgs e)        {            MyClipboard.FormsCopy();        }        private void button2_Click(object sender, EventArgs e)        {            MyClipboard.PresentationCoreCopy();        }        private void button1_Click_1(object sender, EventArgs e)        {            MyClipboard.Win32Copy();        }    }}

演示成果