使用VB.NET在Paint中编辑图像时出现“共享冲突”错误

使用VB.NET在Paint中编辑图像时出现“共享冲突”错误,vb.net,Vb.net,我在VB.NET中编写了一个程序,用于监视从该工具中获取的最近保存的屏幕截图的文件更改 我有一个自定义的FileSystemWatcher类,它是由internet上的某个人编写和共享的,只是进行了自定义,并在我的程序中调用了一个实例 基本问题或目标是,当我使用程序捕获屏幕区域时,我希望它立即将其复制到剪贴板。有时我想编辑捕获的图像,在这种情况下,保存编辑图像后所做的任何编辑都必须自动复制到剪贴板 我使用下面的代码将图像复制到剪贴板 'Subroutine to Copy the capture

我在VB.NET中编写了一个程序,用于监视从该工具中获取的最近保存的屏幕截图的文件更改

我有一个自定义的FileSystemWatcher类,它是由internet上的某个人编写和共享的,只是进行了自定义,并在我的程序中调用了一个实例

基本问题或目标是,当我使用程序捕获屏幕区域时,我希望它立即将其复制到剪贴板。有时我想编辑捕获的图像,在这种情况下,保存编辑图像后所做的任何编辑都必须自动复制到剪贴板

我使用下面的代码将图像复制到剪贴板

'Subroutine to Copy the captured screenshot
'Added 15/09/2014
Sub CopyImageCapture(ByVal ImgPath)

    Dim ThreadA As Thread

    ThreadA = New Thread(AddressOf Me.MyAsyncTask)

    'Setting ApartmentState.STA as this is needed for Clipboard related functionalities
    ThreadA.SetApartmentState(ApartmentState.STA)
    ThreadA.Start(ImgPath)

End Sub

'Threading to handle the Clipboard copy function
'Copy the screenshot to Clipboard
'Added 15/09/2014
Private Sub MyAsyncTask(ByVal ImgPath)

    Clipboard.Clear()
    Clipboard.SetImage(ImgPath)

End Sub
当我选择编辑图像时,下面的代码会注意监视文件更改

Sub MonitorFileChange(ByVal FolderPath, ByVal ItemName)

    Try
        Dim sFolder As String
        Dim sFile As String
        sFolder = FolderPath
        sFile = ItemName

        If IO.Directory.Exists(sFolder) Then
            objWatcher.FolderToMonitor = sFolder
            objWatcher.FileToMonitor = sFile
            'objWatcher.NotifyFilter = (NotifyFilters.FileName Or NotifyFilters.Size)
            objWatcher.StartWatch()
        Else
            MessageBox.Show("Folder does not exist!")

        End If
    Catch ex As Exception
        MsgBox("Encountered an exception in MonitorFileChange subroutine. Details - " + ex.Message)
    End Try

End Sub

'Subrountine to capture FileChanged events (esp. when captured image is edited in Paint and Saved)
'Works in sync with custom class 'clsFSW' for this purpose.
'ADDED: 15/09/2014
Private Sub objWatcher_FileChanged(ByVal FullPath As String) Handles objWatcher.FileChanged


    'Try
    Dim lastWriteTime As DateTime
    lastWriteTime = File.GetLastWriteTime(FullPath)
    Debug.Print(lastWriteTime)

    If (lastWriteTime <> lastRead) Then
        objWatcher.EnableRaisingEvents = False

        'QuickCopy for changes files. BUG FIX
        If (QuickSaveToolStripMenuItem.Checked) Then
            Debug.Print("File Changed: " & FullPath & vbCrLf)

            Dim tempI As System.Drawing.Bitmap = New System.Drawing.Bitmap(FullPath)
            Dim tempI2 As System.Drawing.Bitmap = New System.Drawing.Bitmap(tempI, tempI.Width, tempI.Height)
            CopyImageCapture(tempI2)
            tempI.Dispose()

        End If
        lastRead = lastWriteTime
    End If
    'Catch ex As Exception
    '    MsgBox("Encountered an exception in objWatcher_FileChanged subrountine. Details - " + ex.Message)

    '    'Finally
    '    'objWatcher.EnableRaisingEvents = True
    'End Try

End Sub
问题是,有时当我打开捕获的图像并快速保存或按“保存”几次时,会出现共享冲突错误

有人能帮助解决上述问题吗?代码或逻辑的哪一部分导致了这种情况

另外,如果您检查上面的代码段,有时您没有看到任何特定的模式,但是objWatcher_FileChanged中的catch块被触发,并且错误是找不到参数

有人能帮忙吗

提前谢谢!如果需要更多信息,请告诉我


编辑:请注意,共享冲突错误似乎是从绘画应用程序本身而不是我的程序调用的,但为什么它随机发生,对我来说是个谜。逻辑上有漏洞吗?除了我想要实现的目标之外,还有其他逻辑吗?

尝试处理tempI2。Windows可能正在锁定与tempI一起使用的文件,并将其锁定,因为该文件已分配给tempI2。如果是这样,它可能会一直锁定,直到释放tempI2。

我在使用一个变量tempI时观察到了这一点,释放tempI会使剪贴板变空,天知道为什么,与tempI2一样,它可能会将文件的引用复制到剪贴板。使用clone或其他等效工具复制位图,将该位图分配到剪贴板,这可能会解决问题。谢谢,测试了它,但不幸的是,它使情况恶化,因为我感觉clone实际上锁定了文件。我在这个网站上找到了这篇文章,其中提到了为什么新位图比位图好得多。克隆Oops,你是对的。我假设克隆人复制了像素,就像我使用的两个图形库一样。@SunnyD'Souza你是如何解决你的问题的?我面临着同样的问题,但我从中拍摄图像,并在编辑时通过“绘制冲突”错误发生。