Bonjour,
Tout d'abord, puis-je vous demander d'etre indulgent vu qu'il s'agit ici de mon tout premier script VB. J'ai une experience (limitee cela dit) avec php et VBA, programmant des macros excel lorsque le besoin se fait sentir.

Pour un projet au travail, j'ai besoin d'un programme qui est capable de scanner automatiquement ( a intervalles reguliers) a partir de plusieurs scanners connectes sur le meme ordinateur.
n'ayant trouve aucune solution logicielle gratuite ou payant capable de faire cela, j'ai decide d'utiliser cela comme excuse pour apprendre un langage de programmation, a savoir VB.


Le programme a l'heure actuelle, consiste en un formulaire dans lequel l'utilisateur entre les differents parametres de scan (resolution, couleur, etc.) ainsi que les dossiers et noms de fichiers.

cliquer sur "start scanning" :
- lance une premiere fois la fonction scannerloop (voir ci dessous)
- demarre un timer qui appelle scannerlopp a chaque fois qu'il tick


A l'heure actuelle, le programme fonctionne parfaitement si un seul scanner est present.

Si plusieurs scanners son connectes en revanche, le premier scan se deroule sans soucis pour tous les scanners, mais lorsqu'il faut demarrer le second scan, rien ne se passe, les scanners se "bloquent" (si j'essaie d'y acceder j'ai le message : The WIA devide is busy")
je dois alors le debrancher et le rebrancher.

Ai-je oublie quelque chose comme de "refermer une session" ou de "deconnecter" un scanner a la fin de la boucle ?

voici la fonction scannerloop :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 Public Sub scannerloop()
 
        'format constants
        Const wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
        Const wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
        Const wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
        Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
        Const wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
 
 
        'file format
        Dim fileformat As String
        If Me.FileExt.SelectedItem = "TIF" Then fileformat = wiaFormatTIFF
        If Me.FileExt.SelectedItem = "JPEG" Then fileformat = wiaFormatJPEG
        If Me.FileExt.SelectedItem = "BMP" Then fileformat = wiaFormatBMP
        If Me.FileExt.SelectedItem = "PNG" Then fileformat = wiaFormatPNG
        If Me.FileExt.SelectedItem = "GIF" Then fileformat = wiaFormatGIF
 
        'colors
        Dim colorcode As Integer
        If Me.Colorbox.SelectedItem = "Black and white" Then colorcode = 4
        If Me.Colorbox.SelectedItem = "Greyscale" Then colorcode = 2
        If Me.Colorbox.SelectedItem = "Colour" Then colorcode = 1
 
        'Resolution
        Dim dpi As Integer
        dpi = Me.dpiBox.SelectedItem
        Dim horizextent = dpi * 8.2
        Dim vertextent = dpi * 11.6
 
 
        Dim j As String = 1
        Dim DeviceManager1 = CreateObject("WIA.DeviceManager")   'wia device manager
 
        For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
 
            If DeviceManager1.DeviceInfos(i).Type = 1 Then  'Select only scanners, not webcams etc...
 
                'startpoint to calculate how long it is to scan
                Dim ScanStart = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
 
 
                'Directory + file
                Dim targetdir = Me.ProjectFolderBox.Text & "\scans\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                Form2.CurrentActionLabel.Text = "Scanning from scanner #" & j
 
 
                Dim Scanner As WIA.Device = DeviceManager1.DeviceInfos(i).connect
 
 
                If IsNothing(Scanner) Then
                    Log(Me.logfilename, Now & " | Scanner #" & j & " not found")
                Else
                    Try
                        Dim Img As WIA.ImageFile
 
                        With Scanner.Items(1)
                            .Properties("6146").Value = colorcode '4 is Black-white,gray is 2, color 1 (Color Intent)
                            .Properties("6147").Value = dpi  'dots per inch/horizontal
                            .Properties("6148").Value = dpi 'dots per inch/vertical
                            .Properties("6149").Value = 0 'x point where to start scan
                            .Properties("6150").Value = 0 'y-point where to start scan
 
                            'Following is A4 paper size. (Not 100% accurate because real A4 Ht errors)
                            .Properties("6151").Value = horizextent 'horizontal exent DPI x inches wide
                            .Properties("6152").Value = vertextent 'vertical extent DPI x inches tall
                            '  .Properties("4104").Value = 8 'bits per pixel
 
                        End With
 
                        'transfer image
                        Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.
 
                        'kill previous file if exists to avoid errors
                        If System.IO.File.Exists(targetdir) = True Then
                            Kill(targetdir)
                        End If
 
                        Img.SaveFile(targetdir)
 
                        'last scan
                        Form2.LastFileLabel.Text = "\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                        Form2.LastScanLabel.Text = Now
 
                    Catch ex As Exception
                        MsgBox(ex.Message)
                    Finally
 
                        Scanner = Nothing
                    End Try
                End If
 
                'End time for the scan
                Dim ScanEnd = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
 
                'log
                Log(Me.logfilename, Now & " | Scanner #" & j & " | Scanned " & targetdir & " | duration: " & (ScanEnd - ScanStart))
 
                j = j + 1
 
            End If
 
 
 
        Next
        DeviceManager1 = Nothing
 
 
        Me.CurrFileIndex = Me.CurrFileIndex + 1
 
        Me.ScanCount = Me.ScanCount + 1
        Me.NextScan = DateAdd("n", Me.IntervalBox.Value, Now)
 
        Form2.ScanCountLabel.Text = Me.ScanCount
        Form2.NextScanLabel.Text = Me.NextScan
        Form2.CurrentActionLabel.Text = "Waiting..."
 
        'Increment next file index and update in config file
        Me.FileIndexBox.Value = Me.CurrFileIndex
        SaveCfg()
 
    End Sub

Merci d'avance pour votre aide et encore une fois, soyez indulgent si le code est moche, c'est mon tout premier et je suis plus qu'avide d'apprendre