VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > c#编程 >
  • C#教程之C#线程间不能调用剪切板的解决方法

最近做一个C#项目,需要用到线程,而且要用到剪切板,创建了一个子线程之后发现在子线程中剪切板上获取不到数据,经过一番查找与测试最终该问题得以解决,现将解决方法归纳如下,供大家参考:

第一步:

?
1
2
3
4
5
6
7
8
9
public void btnAutoFocus_Click(object sender,EventArgs e)
{
Thread myThread = new Thread(msc.AutoFocusArithmetic);
//注意,一般启动一个线程的时候没有这句话,但是要操作剪切板的话这句话是必需要加上的,
//因为剪切板只能在单线程单元中访问
//这里的STA就是指单线程单元
myThread .SetApartmentState(ApartmentState.STA); 
myThread .Start();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static class Program
{
///
/// 应用程序的主入口点。
///
 
[STAThread] //这句话保留,如果要在主线程中访问剪切板,这句式必须要的
//如果要在子线程中访问剪切板,这个应该可以不要,但是默认是有的
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());
}
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}

 

至此问题得以解决。



相关教程