Scanner automatiquement depuis 2 scanners sur 1 ordi (VB.net + WIA)

Scanner automatiquement depuis 2 scanners sur 1 ordi (VB.net + WIA) - VB/VBA/VBS - Programmation

Marsh Posté le 29-11-2012 à 05:45:16    

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


 
 
 
J'ai essaye d'autres choses, comme inclure la boucle qui passe en revue tous les device WIA detectes pour que cela scanne plusieurs fois independamment du reste du programme :
 
 

Code :
  1. Dim DeviceManager1 = CreateObject("WIA.DeviceManager" )   'wia device manager
  2. For k = 1 To 3
  3.             Dim j As String = 1
  4.             For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
  5. [...]
  6.           Next i
  7.         Next k
  8.         DeviceManager1 = Nothing


 
 
Le premier tour de la boucle fonctionne, chaque scanner scanne une fois. Mais la encore, ca bloque au moment du deuxieme scan.
J'ai essaye la meme chose en incluant la declaration du devicemanager et sa reinitialisation dans la boucle cette fois :
 

Code :
  1. For k = 1 To 3
  2. Dim DeviceManager1 = CreateObject("WIA.DeviceManager" )   'wia device manager
  3.             Dim j As String = 1
  4.             For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
  5. [...]
  6.           Next i
  7.         DeviceManager1 = Nothing
  8.         Next k


Mais ca ne change absolument rien.
 
 
 
J'ai aussi essaye de logguer chaque etape dans un fichier texte pour voir ou cela bloque exactement :
 

Code :
  1. Dim DeviceManager1 = CreateObject("WIA.DeviceManager" )   'wia device manager
  2.         Dim j As String = 1
  3.         For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
  4.             If DeviceManager1.DeviceInfos(i).Type = 1 Then  'Select only scanners, not webcams etc...
  5.                 'startpoint to calculate how long it is to scan
  6.                 Dim ScanStart = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
  7.                 'Directory + file
  8.                 Dim targetdir = Me.ProjectFolderBox.Text & "\scans\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
  9.                 Form2.CurrentActionLabel.Text = "Scanning from scanner #" & j
  10.                 Dim Scanner As WIA.Device = DeviceManager1.DeviceInfos(i).connect
  11.                 If IsNothing(Scanner) Then
  12.                     Log(Me.logfilename, Now & " | Scanner #" & j & " not found" )
  13.                 Else
  14.                     Try
  15.                         Dim Img As WIA.ImageFile
  16.                         'log
  17.                         Log(Me.logfilename, Now & " | Scanner #" & j & " | Img initialized" )
  18.                         With Scanner.Items(1)
  19.                             .Properties("6146" ).Value = colorcode '4 is Black-white,gray is 2, color 1 (Color Intent)
  20.                             .Properties("6147" ).Value = dpi  'dots per inch/horizontal
  21.                             .Properties("6148" ).Value = dpi 'dots per inch/vertical
  22.                             .Properties("6149" ).Value = 0 'x point where to start scan
  23.                             .Properties("6150" ).Value = 0 'y-point where to start scan
  24.                             'Following is A4 paper size. (Not 100% accurate because real A4 Ht errors)
  25.                             .Properties("6151" ).Value = horizextent 'horizontal exent DPI x inches wide
  26.                             .Properties("6152" ).Value = vertextent 'vertical extent DPI x inches tall
  27.                             '  .Properties("4104" ).Value = 8 'bits per pixel
  28.                         End With
  29.                         'log
  30.                         Log(Me.logfilename, Now & " | Scanner #" & j & " | properties initialized" )
  31.                         'transfer image
  32.                         Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.
  33.                         'log
  34.                         Log(Me.logfilename, Now & " | Scanner #" & j & " |Transfer done" )
  35.                         'kill previous file if exists to avoid errors
  36.                         If System.IO.File.Exists(targetdir) = True Then
  37.                             Kill(targetdir)
  38.                             'log
  39.                             Log(Me.logfilename, Now & " | Scanner #" & j & " | deleted existing " & targetdir)
  40.                         End If
  41.                         Img.SaveFile(targetdir)
  42.                         'log
  43.                         Log(Me.logfilename, Now & " | Scanner #" & j & " | saved " & targetdir)
  44.                         'last scan
  45.                         Form2.LastFileLabel.Text = "\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
  46.                         Form2.LastScanLabel.Text = Now
  47.                     Catch ex As Exception
  48.                         MsgBox(ex.Message)
  49.                     Finally
  50.                         Scanner = Nothing
  51.                     End Try
  52.                 End If
  53.                 'End time for the scan
  54.                 Dim ScanEnd = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
  55.                 'log
  56.                 Log(Me.logfilename, Now & " | Scanner #" & j & " | Scanned " & targetdir & " | duration: " & (ScanEnd - ScanStart))
  57.                 j = j + 1
  58.             End If
  59.         Next i


 
 
Et voici le fichier de log genere :

Code :
  1. Scan starts 29/11/2012 9:24:31 AM | Interval :Start scanning with 5 min | Res:100 DPI |
  2. 29/11/2012 9:24:31 AM | Scanner #1 | Img initialized
  3. 29/11/2012 9:24:31 AM | Scanner #1 | properties initialized
  4. 29/11/2012 9:24:49 AM | Scanner #1 |Transfer done
  5. 29/11/2012 9:24:49 AM | Scanner #1 | saved C:\__2\scans\Scanner1\S1_img_1.TIF
  6. 29/11/2012 9:24:49 AM | Scanner #1 | Scanned C:\__2\scans\Scanner1\S1_img_1.TIF | duration: 18
  7. 29/11/2012 9:24:49 AM | Scanner #2 | Img initialized
  8. 29/11/2012 9:24:49 AM | Scanner #2 | properties initialized
  9. 29/11/2012 9:25:08 AM | Scanner #2 |Transfer done
  10. 29/11/2012 9:25:08 AM | Scanner #2 | saved C:\__2\scans\Scanner2\S2_img_1.TIF
  11. 29/11/2012 9:25:08 AM | Scanner #2 | Scanned C:\__2\scans\Scanner2\S2_img_1.TIF | duration: 19
  12. 29/11/2012 9:25:08 AM | Scanner #1 | Img initialized
  13. 29/11/2012 9:25:08 AM | Scanner #1 | properties initialized


 
Il semble que cela bloque a cette etape:

Code :
  1. Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.


 
 
 
 
 
Il semble que WIA est content de passer du scanner #1 au scanner #2 mais refuse de revenir au scanner #1 ensuite.
Aussi, chose surprenante, lors du deuxieme tour de la boucle, le scanner #1 est cense scanner a nouveau mais c'est le scanner #2 qui se met a clignoter et bloque.
Est-il possible que WIA selectionne le dernier scanner utilise (scanner #2) comme scanner par defaut ?
Si oui, est il possible de reinitialiser cela ? Aussi, pourquoi cela ne le fait-il pas pour passer du scanner #1 au scanner #2 ?
 
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 29-11-2012 à 05:45:16   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed