快捷搜索:

C# Winform和Windows API实现剪贴板无缝自动保存器

使用C#和Window API做了个自动保存剪贴板内的图片的对象,用在给视频截图上是最好不过的了。共享之。

点击Start按钮,就会在剪贴板内容发生变更时自动把保存到指定位置(保存为jpg款式的图片),并且以指定的字符串作为文件的前缀,后面跟上序号。以是这个对象是和PrtSc截屏键慎密结合应用的,按一次PrtSc,就保存一张图片。就算不停按着不放,也能把每个截屏敕令都履行到。

别的,Distinct按钮可以把Path文件夹所在的所有文件反省一遍,自动删掉落内容完全一样的文件。这个很实用吧。

源码在此:bitzhuwei.Clipboard.Winform.zip

release版法度榜样在此:bitzhuwei.Clipboard.Winform-release.zip

1. 将剪贴板内的图片保存到文件

代码如下。

void SaveClipboardImage()

{var data = System.Windows.Forms.Clipboard.GetDataObject();

var bmap = (Image)(data.GetData(typeof(System.Drawing.Bitmap)));if (bmap != null)

{bmap.Save("bitzhuwei.cnblogs.com.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

bmap.Dispose();}

2. 监听剪贴板变更的事故

override掉落主窗体的WndProc事故,这样就能够实现当且仅当剪贴板内容发生变更时履行一次保存动作了。

const int WM_DRAWCLIPBOARD = 0x308;

const int WM_CHANGECBCHAIN = 0x030D;protected override void WndProc(ref Message m)

{if (nextClipboardViewer == null)

nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);switch (m.Msg)

{case WM_CHANGECBCHAIN:

if (m.WParam == nextClipboardViewer) { nextClipboardViewer = m.LParam; }else { SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); }

break;case WM_DRAWCLIPBOARD:

SaveClipboardImage();//将WM_DRAWCLIPBOARD 消息通报到下一个察看链中的窗口

SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);//将WM_DRAWCLIPBOARD 消息通报到下一个察看链中的窗口

break;default:

base.WndProc(ref m);break;

}}

3. 文件雷同判别

用文件流一个字节一个字节的判断即可。大年夜部分不合的文件,判断不了若干次就会呈现字节不一样了,以是我对这个措施的效率照样有信心的。自己也试验过,对视频截图获得的1000多张图片(全屏的截图1280*800的图片),2分钟就把重复的文件都删掉落了。

private void DeleteRedundancyFiles(string directory)

{var files = (new DirectoryInfo(directory)).GetFiles("*.jpg");

for (int i = 0; i{

for (int j = i + 1; j{

if (File.Exists(files[i].FullName) && File.Exists(files[j].FullName)){

bool removeJ = IsSameContent(files, i, j);if (removeJ)

{try

{File.Delete(files[j].FullName);

}catch (Exception)

{ }}

}}

}}

private static bool IsSameContent(FileInfo[] files, int i, int j){

var result = true;using (FileStream fsi = new FileStream(files[i].FullName, FileMode.Open))

{using (FileStream fsj = new FileStream(files[j].FullName, FileMode.Open))

{var counti = 0;

var countj = 0;do

{const int length = 100;

var bytesi = new byte[length];var bytesj = new byte[length];

counti = fsi.Read(bytesi, 0, length);countj = fsj.Read(bytesj, 0, length);

if (counti != countj){

result = false;}

else{

for (int k = 0; k{

if (bytesi[k] != bytesj[k]){

result = false;break;

}}

}} while (result && counti > 0 && countj > 0);

}}

return result;}

您可能还会对下面的文章感兴趣: