Automatisieren Sie die Windows-Scanfunktion

Automatisieren Sie die Windows-Scanfunktion

Ich habe einen ziemlich alten Canon-Scanner, den Pixma MP 110. Natürlich stellt Canon keine brauchbaren Treiber zur Verfügung (ihre Site ist wirklich hoffnungslos, frustrierend und in jeder Hinsicht nutzlos) – die einzige Software, die ich gefunden habe, ist eine chinesische Version mit überall Fragezeichen.

Wenn ich jedoch zuGeräte und DruckerManager unter Windows und klicke mit der rechten Maustaste auf den Scanner. Ich verwende möglicherweise den in Windows integrierten Scan-Manager in meiner Muttersprache. Er hat zwar etwas eingeschränkte Funktionen, ist aber immer noch besser als ein Haufen Schaltflächen voller Fragezeichen.

Ich habe ein wenig gesucht und herausgefunden, dass die Funktion, von der ich spreche, heißtWIA.

Hier ist der Ansatz, allerdings auf Tschechisch, der für Sie vielleicht so klingt, wie diese Fragezeichen für mich klingen. Bildbeschreibung hier eingeben

Nach der AuswahlScannen startenein Dialog wird angezeigt. Es läuft unter explorer.exe, daher gibt es keine Änderung, wenn man herausfindet, um welches Programm es sich eigentlich handelt. Bildbeschreibung hier eingeben

Ich möchte eine Desktopverknüpfung erstellen, dieautomatisch mit dem Scannen beginnen, ohne dass ich auf die Schaltfläche "Scannen starten" Und "Scan".

Außerdem hat der Scanner eine Taste zum Starten des Scannens und mein Computer erkennt, wenn diese gedrückt wird. Wenn ich sie drücke, fragt mich Windows, welche Anwendung für die Taste ausgeführt werden soll - allerdings funktionierte hier keine Scanner-Software, noch erschien eine in der Auswahl, die Windows mir gibt. Ich habe mich gefragt, ob ich das hacken könnte, um es auszuführenjede Anwendung für diese Schaltfläche. (das wäre nützlich, wenn ich jemals eine Antwort auf die Hauptfrage bekäme).

Bildbeschreibung hier eingeben

Also die Fragen noch einmal, falls Sie zu faul waren, den langen Beitrag zu lesen:

  1. Wie kann ich Windows mithilfe eines Batch-Skripts oder eines einfachen Befehls in .lnkeiner Datei automatisch mit dem Scannen vom installierten Scanner aus beginnen?
  2. (optional) Wie weise ich dem Tastendruck meines Scanners eine beliebige Anwendung zu?

Antwort1

PowerShell-Lösung

Das Skript sollte mit den meisten Scannern funktionieren, egal ob Canon, Epson oder was auch immer, solange sie WIA-kompatibel sind und den transfer()Befehl unterstützen. Das Skript startet sofort den Scanvorgang. Alle Optionen wie Dateiname, Pfad oder Bildformat sind bereits über das Skript festgelegt. Sie müssen den Scanvorgang nur mit einer Verknüpfung starten

  1. Speichern Sie es zB alsD:\StartScan.ps1
  2. Erstellen Sie eine neue Verknüpfung und verweisen Sie sie auf

    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "D:\StartScan.ps1"
    

StartScan.ps1

# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()

# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess

# Store file format GUID strings
$wiaFormatBMP  = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatPNG  = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatGIF  = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"

# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
    $image = $item.Transfer() 
}

# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)

# Build filepath from desktop path and filename 'Scan 0'
$filename = "$([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"

# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) {[void](++$index)}
$filename = $filename -f $index

# Save image to 'C:\Users\<username>\Desktop\Scan {x}'
$image.SaveFile($filename)

# Show image 
& $filename

Anpassungen

  • Wechseln Sie Item("FormatID").Value = $wiaFormatJPEGzu $wiaFormatPNG(oder TIFF, BMP, GIF), wenn Sie ein anderes Bildformat benötigen
  • Ändern Sie $([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg", wenn Sie einen anderen Ausgabepfad benötigen. Ändern Sie die Erweiterung .jpg, wenn Sie zuvor das Bildformat geändert haben

Verwendete Ressourcen

Antwort2

dies ist das PS-Skript, das ich verwende. Ich habe es aus einer der Antworten in diesem Thread kopiert und so geändert, dass es mit einem anderen Feeder funktioniert. Falls Sie den Glas-Feeder nicht verwenden, können Sie den Feeder ändern, indem Sie den „Prop-Wert“ auf 0 1 2 ändern. Dieses Skript zeigt das Bild nach dem Scannen nicht an, sondern speichert es nur.

# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()

# Set the scanner source to the feeder
foreach ($prop in $device.Properties) {
    if ($prop.Name -eq "Document Handling Select") {
        $prop.Value = 1
    }
}

# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess

# Store file format GUID strings
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"

# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
    $image = $item.Transfer()
}

# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)

# Build filepath from C:\scan path and filename 'Scan 0'
$filename = "C:\scan\Scan {0}.pdf"

# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) { [void] (++$index)}
$filename = $filename -f $index

# Save image to 'C:\scan\Scan {x}'
$image.SaveFile($filename)

Antwort3

Dies ist möglicherweise bei stackoverflow besser aufgehoben. Suchen Sie nach dem Tag „WIA“ und Sie finden Leute, die sich mit der Automatisierung befasst haben. Expertenbenutzerebene.

Es ist ganz einfach, ein VB-Skript zum Starten des Dialogs zu erstellen, aber (soweit mir mein begrenztes Wissen bekannt ist) (a) erfordert WIA einen Host zur Verarbeitung des gescannten Bilds, sodass alles, was Sie tun, das Bild empfangen und speichern muss (nicht nur den Dialog starten) und (b) der WIA-Dialog scheint keinen „unbeaufsichtigten“ Modus zu haben.

Eine Ressource für Sie:WIA Automatisierung

Und ein VBS-Skript zum Starten von WIA (erstellen Sie beispielsweise eine Textdatei mit dem Namen launchWia.vbs):

set oDlg = CreateObject("WIA.CommonDialog")
oDlg.ShowAcquireImage()

Kann mit einer Batchdatei ausgeführt werden:

cscript launchWia.vbs
pause

Welches über eine Verknüpfung ausgeführt werden kann.

Auch hier wird Ihnen dies wahrscheinlich nichts bringen, da das Bild nicht verarbeitet wird. Beispiele zur Bildverarbeitung finden Sie in den MSDN-Dokumenten.

Antwort4

scan.vbs

Set CommonDialog = CreateObject("WIA.CommonDialog")
Set DeviceManager = CreateObject("WIA.DeviceManager")

' List all Available Devices by Name and DeviceID
' The following example shows how to list all available Deviceices by name and DeviceID. 
Dim i, n 'As Integer
n = DeviceManager.DeviceInfos.Count
WScript.Echo "Number of Deviceice found = " & n
For i = 1 to DeviceManager.DeviceInfos.Count
  WScript.Echo " Device " & i & ":" & vbTab & DeviceManager.DeviceInfos(i).Properties("Name").Value & vbTab & "(" & DeviceManager.DeviceInfos(i).DeviceID & ")"
Next

Set DevInfo = DeviceManager.DeviceInfos(1)
Set Device = DevInfo.Connect

Device.Items(1).Properties("6146").Value = 2 'colors
Device.Items(1).Properties("6147").Value = 600 'dots per inch/horizontal
Device.Items(1).Properties("6148").Value = 600 'dots per inch/vertical
Device.Items(1).Properties("6149").Value = 0 'x point where to start scan
Device.Items(1).Properties("6150").Value = 0 'y point where to start scan
Device.Items(1).Properties("6151").Value = 5100 'horizontal exent DPI x inches wide
Device.Items(1).Properties("6152").Value = 7002 'vertical extent DPI x inches tall
Device.Items(1).Properties("4104").Value = 8 'bits per pixel

'Device.Items(1).Properties("3098").Value = 1700 'page width
'Device.Items(1).Properties("3099").Value = 2196 'page height

Set img = CommonDialog.ShowTransfer(Device.Items(1), "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}", true)

img.SaveFile "F:/image.bmp"

Laufen"C:/Windows/System32/cscript.exe" //X "F:/scan.vbs"

verwandte Informationen