最近做一個(gè)C#項(xiàng)目,需要用到線程,而且要用到剪切板,創(chuàng)建了一個(gè)子線程之后發(fā)現(xiàn)在子線程中剪切板上獲取不到數(shù)據(jù),經(jīng)過一番查找與測試最終該問題得以解決,現(xiàn)將解決方法歸納如下,供大家參考:
第一步:
public void btnAutoFocus_Click(object sender,EventArgs e){Thread myThread = new Thread(msc.AutoFocusArithmetic);//注意,一般啟動(dòng)一個(gè)線程的時(shí)候沒有這句話,但是要操作剪切板的話這句話是必需要加上的,//因?yàn)榧羟邪逯荒茉趩尉€程單元中訪問//這里的STA就是指單線程單元myThread .SetApartmentState(ApartmentState.STA); myThread .Start();}
第二步:還需要將Program啟動(dòng)類中
static class Program{////// 應(yīng)用程序的主入口點(diǎn)。///[STAThread] //這句話保留,如果要在主線程中訪問剪切板,這句式必須要的//如果要在子線程中訪問剪切板,這個(gè)應(yīng)該可以不要,但是默認(rèn)是有的static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());//Application.Run(new TestRGBPixelThumbForm());//Application.Run(new TestImageForm());//Application.Run(new TestJudgeDefinitionForm());//Application.Run(new TestVirusForm());}}
第三步:這個(gè)是讀取剪切板數(shù)據(jù)
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;}
至此問題得以解決。
新聞熱點(diǎn)
疑難解答
圖片精選