• C# 线程间不能调用剪切板的问题


    最近做一个项目,需要用到线程,而且要用到剪切板,创建了一个子线程之后发现在子线程中剪切板上获取不到数据,当时特别纳闷,上网查资料,最后终于搞定,现将解决方法归纳如下:

    第一步:

    public void btnAutoFocus_Click(object sender,EventArgs e)

    {

    Thread myThread = new Thread(msc.AutoFocusArithmetic);

    //注意,一般启动一个线程的时候没有这句话,但是要操作剪切板的话这句话是必需要加上的,因为剪切板只能在单线

    //程单元中访问,这里的STA就是指单线程单元

    myThread .SetApartmentState(ApartmentState.STA);  

    myThread .Start();

    }

    第二步:还需要将Program启动类中

    static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]  //这句话保留,如果要在主线程中访问剪切板,这句式必须要的,如果要在子线程中访问剪切板,这个应该可以不要,但是默认是有的,不过这个我没有测试过不要这句话是什么结果,后面有时间测试之后再发博文
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
        }

    第三步:这个是读取剪切板数据,

    private Image GetCaptureImage()
    {
            IDataObject iData = Clipboard.GetDataObject();
            Image img = null;
            if (iData != null)
            {
                 if (iData.GetDataPresent(DataFormats.Bitmap))
                 {
                      img = (Image)iData.GetData(DataFormats.Bitmap);
                 }
                 else if (iData.GetDataPresent(DataFormats.Dib))
                 {
                      img = (Image)iData.GetData(DataFormats.Dib);
                 }
            }
            return img;

    }

  • 相关阅读:
    java表达式中运算符优先级
    数据库建表规则
    linux 安装java环境
    springboot指定端口的三种方式
    服务器监控
    Dubbo 的配置主要分为三大类
    oracle数值函数 abs()、 ceil()、 cos()、 cosh()
    linux基础命令总结
    redis+sentinel集群部署
    centos7制作本地yum源
  • 原文地址:https://www.cnblogs.com/as3lib/p/6418186.html
Copyright © 2020-2023  润新知