如果使用windows form,这一功能已经实现。
但是我想使用class,生成dll后供其他程序调用,这样的代码怎么写?
以下代码是基于class的,生成dll被其他程序调用后有问题,但是不知道怎么解决。问题有:
1. 第一次调用dll时,clipboard中没有任何数据
2. 第二次及后续的调用中,可以实现保存截屏图片,但是无法清空clipboard中的数据。
[C#] 纯文本查看 复制代码 public void CaptureWindow(string fileName, ImageFormat imageFormat, string printType)
{
AltPrintScreen_API(printType);
int i = 0;
if (User32.OpenClipboard(IntPtr.Zero))
{
IntPtr hMem = User32.GetClipboardData(2);
while (hMem.ToInt32() == 0 && i < 3)
{
if (i == 2) throw new IndexOutOfRangeException("Error0:Can't Get Image" + hMem.ToString()); //由此判断出第一次调用此dll时,clipboard中并没有任何数据
AltPrintScreen_API(printType);
hMem = User32.GetClipboardData(2);
i = i + 1;
}
new Bitmap(Image.FromHbitmap(hMem), Image.FromHbitmap(hMem).Width, Image.FromHbitmap(hMem).Height).Save(fileName, imageFormat);
User32.EmptyClipboard(); //在第二次调用此dll及后续的调用中,clipboard中的数据仍然保留,并没有被清空
User32.CloseClipboard();
}
}
public static void AltPrintScreen_API(string printType)
{
//Alt - VK_MENU - 18
//PrintScreen - VK_SNAPSHOT - 44
try
{
if (printType == "AltPrintScreen")
{
KeyDown_API(18);
KeyDown_API(44);
Application.DoEvents();
KeyUp_API(18);
KeyUp_API(44);
}
else if (printType == "PrintScreen")
{
KeyDown_API(44);
Application.DoEvents();
KeyUp_API(44);
}
}
catch(Exception)
{
throw new Exception("Error PrintScreen: Check Print Type");
}
}
|