Scannen aus Ihrer App

In diesem Thema wird beschrieben, wie Sie Inhalte aus Ihrer App mithilfe eines Flatbeds, Feeders oder einer automatisch konfigurierten Scanquelle überprüfen.

Wichtige APIs

Wichtig

Die Windows.Devices.Scanners-APIs sind Teil der Desktopgerätefamilie. Apps können diese APIs nur in der Desktopversion von Windows 10 verwenden.

Damit Sie über Ihre App scannen können, müssen Sie zunächst die verfügbaren Scanner auflisten, indem Sie ein neues DeviceInformation-Objekt deklarieren und den DeviceClass-Typ abrufen. Nur Scanner, die lokal mit WIA-Treibern installiert sind, werden in Ihrer App aufgeführt und stehen darin zur Verfügung.

Nachdem Ihre App verfügbare Scanner aufgelistet hat, kann sie die auf dem Scannertyp basierenden automatisch konfigurierten Scaneinstellungen verwenden oder einfach unter Verwendung der verfügbaren Flachbett- oder Einzugsscanquelle scannen. Um die automatisch konfigurierten Einstellungen verwenden zu können, muss der Scanner für die automatische Konfiguration aktiviert sein und darf nicht mit einem Flachbett- und einem Feederscanner ausgestattet sein. Weitere Informationen finden Sie unter Automatisch konfigurierter Scan.

Aufzählen verfügbarer Scanner

Windows erkennt Scanner nicht automatisch. Sie müssen diesen Schritt ausführen, damit Ihre App mit dem Scanner kommunizieren kann. In diesem Beispiel erfolgt die Scannergeräteaufzählung mit dem Windows.Devices.Enumeration-Namespace.

  1. Fügen Sie zunächst diese using-Anweisungen zu Ihrer Klassendefinitionsdatei hinzu.
    using Windows.Devices.Enumeration;
    using Windows.Devices.Scanners;
  1. Implementieren Sie dann die Geräteüberwachung, um mit der Scanneraufzählung zu beginnen. Weitere Informationen finden Sie unter Aufzählen von Geräten.
    void InitDeviceWatcher()
    {
       // Create a Device Watcher class for type Image Scanner for enumerating scanners
       scannerWatcher = DeviceInformation.CreateWatcher(DeviceClass.ImageScanner);

       scannerWatcher.Added += OnScannerAdded;
       scannerWatcher.Removed += OnScannerRemoved;
       scannerWatcher.EnumerationCompleted += OnScannerEnumerationComplete;
    }
  1. Erstellen Sie einen Ereignishandler für den Fall, dass ein Scanner hinzugefügt wird.
    private async void OnScannerAdded(DeviceWatcher sender,  DeviceInformation deviceInfo)
    {
       await
       MainPage.Current.Dispatcher.RunAsync(
             Windows.UI.Core.CoreDispatcherPriority.Normal,
             () =>
             {
                MainPage.Current.NotifyUser(String.Format("Scanner with device id {0} has been added", deviceInfo.Id), NotifyType.StatusMessage);

                // search the device list for a device with a matching device id
                ScannerDataItem match = FindInList(deviceInfo.Id);

                // If we found a match then mark it as verified and return
                if (match != null)
                {
                   match.Matched = true;
                   return;
                }

                // Add the new element to the end of the list of devices
                AppendToList(deviceInfo);
             }
       );
    }

Überprüfen

  1. Abrufen eines ImageScanner-Objekts

Für jeden ImageScannerScanSource-Aufzählungstyp (ob Default, AutoConfigured, Flatbed oder Feeder) müssen Sie zunächst ein ImageScanner-Objekt erstellen, indem Sie wie folgt die ImageScanner.FromIdAsync-Methode aufrufen.

   ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
  1. Einfach scannen

Zum Scan mit den Standardeinstellungen ist Ihre App bei der Auswahl eines Scanners vom Windows.Devices.Scanners-Namespace abhängig und scannt aus dieser Quelle. Es werden keine Scaneinstellungen geändert. Die möglichen Scanner sind „Automatisch konfiguriert“, „Flachbett“ und „Einzug“. Bei dieser Scanart kommt es wahrscheinlich zu einem erfolgreichen Scanvorgang, selbst wenn der Scan von der falschen Quelle aus stattfindet (wie Flachbett anstelle von Einzug).

Hinweis Wenn der Benutzer das zu scannende Dokument im Feeder platziert, scannt der Scanner stattdessen vom Flachbett aus. Wenn der Benutzer versucht, aus einem leeren Einzug zu scannen, generiert der Scanauftrag keine gescannten Dateien.  

    var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder).AsTask(cancellationToken.Token, progress);
  1. Scannen aus der Quelle „Automatisch konfiguriert“, „Flachbett“ oder „Einzug“

Ihre App kann den automatisch konfigurierten Scan des Geräts mit den optimalen Scaneinstellungen verwenden. Bei dieser Option kann das Gerät selbst die besten Scaneinstellungen, wie Farbmodus und Scanauflösung, basierend auf dem zu scannenden Inhalt bestimmen. Das Gerät wählt die Scaneinstellungen zur Laufzeit für jeden neuen Scanauftrag.

Hinweis Nicht alle Scanner unterstützen dieses Feature. Daher muss die App überprüfen, ob der Scanner dieses Feature unterstützt, bevor sie diese Einstellung verwendet.

In diesem Beispiel prüft die App zunächst, ob der Scanner die automatische Konfiguration unterstützt, und startet dann den Scanvorgang. Um einen Flachbett- oder Einzugsscanner anzugeben, ersetzen Sie einfach AutoConfigured durch Flatbed oder Feeder.

    if (myScanner.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
    {
        ...
        // Scan API call to start scanning with Auto-Configured settings.
        var result = await myScanner.ScanFilesToFolderAsync(
            ImageScannerScanSource.AutoConfigured, folder).AsTask(cancellationToken.Token, progress);
        ...
    }

Scanvorschau

Sie können Code hinzufügen, um eine Scanvorschau vor dem Scan in einen Ordner anzuzeigen. Im folgenden Beispiel prüft die App, ob der Flatbed-Scanner die Vorschau unterstützt, und zeigt dann die Scanvorschau an.

if (myScanner.IsPreviewSupported(ImageScannerScanSource.Flatbed))
{
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
                // Scan API call to get preview from the flatbed.
                var result = await myScanner.ScanPreviewToStreamAsync(
                    ImageScannerScanSource.Flatbed, stream);

Abbrechen des Scans

Sie können wie folgt zulassen, dass Benutzer den Scanauftrag während der Ausführung abbrechen.

void CancelScanning()
{
    if (ModelDataContext.ScenarioRunning)
    {
        if (cancellationToken != null)
        {
            cancellationToken.Cancel();
        }                
        DisplayImage.Source = null;
        ModelDataContext.ScenarioRunning = false;
        ModelDataContext.ClearFileList();
    }
}

Scannen mit Fortschritt

  1. Erstellen eines System.Threading.CancellationTokenSource-Objekts.
cancellationToken = new CancellationTokenSource();
  1. Richten Sie den Fortschritts-Ereignishandler ein, und rufen Sie den Scanfortschritt ab.
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
    var progress = new Progress<UInt32>(ScanProgress);

Scannen in die Bildbibliothek

Benutzer können dynamisch mit der FolderPicker-Klasse in beliebige Ordner scannen. Sie müssen aber die Funktion Bildbibliothek im Manifest deklarieren, damit Benutzer in diesen Ordner scannen können. Weitere Informationen zu App-Funktionen finden Sie unter Deklarationen der App-Funktionen.