none
saveScreenshotToFilesAsync Funktion Error unter Windows 1803 RRS feed

  • Frage

  • Hallöchen zusammen,

    die Funktion "saveScreenshotToFilesAsync" hat mit dem Creators-Fall-Update 1709 so halb funktioniert. Das Promise wurde beim erfolgreichen ablegen eines Screenshots aber nicht ausgelöst, wodurch ich hier einen Workaround erstellt habe. Mit 1803 hingegen wird das Promise aufgelöst, nur meldet dieses direkt einen Fehler siehe unten. 

    [object Windows.Media.AppRecording.AppRecordingSaveScreenshotResult]: {extendedError: -2147417842, savedScreenshotInfos: Object, succeeded: false}
    extendedError: -2147417842
     
    savedScreenshotInfos: Object
    length: 0
    size: 0

    Hier der aufrufende Code-Ausschnitt:

    const prefix = 'scr'
    const tempDir = Windows.Storage.ApplicationData.current.temporaryFolder
    const AppRecordingManager = Windows.Media.AppRecording.AppRecordingManager
    const AppRecordingSaveScreenshotOption = Windows.Media.AppRecording.AppRecordingSaveScreenshotOption
    const requestedFormats = [Windows.Media.MediaProperties.MediaEncodingSubtypes.png]
    const asyncResult = AppRecordingManager.getDefault().saveScreenshotToFilesAsync(tempDir, prefix, AppRecordingSaveScreenshotOption.hdrContentVisible, requestedFormats)
    asyncResult.then(function (thenResult) {
          console.log("thenResult", thenResult)
    }).done(function (doneResult) {
          console.log("doneResult", doneResult)
    })
    Das Problem hatte ich zuvor in der zu der Doku dazugehörige Github eingestellt. Hier scheint aber der geeignetere Platz dafür zu sein. Zu meiner Frage, ist hier etwas falsch am aufrufenden Code und kann mir hier jemand weiterhelfen? Die Funktion soll aus einer UWP-Anwendung aufgerufen werden.

    Viele Grüße

    Fabiryn

    Dienstag, 12. Juni 2018 09:11

Antworten

  • Mit Cordova hat man doch die Möglichkeit ein plugin zu schreiben das man dann mit Ionic nutzen kann. Eine andere Möglichkeit fällt mir auch nicht ein. Funktioniert den das fertige Plugin von Cordova nicht Link.

    Du könntest versuchen auf UserVoice den Fehler zu melden. Aber Du hast schon auf Github keine Antwort bekommen. Ich vermute das es auf UserVoice nicht anders sein wird.

    Es muss auch gar kein Fehler sein. Vielleicht ist für die Nutzung dieser Funktion eine entsprechende Grafikkarte nötig. So ist es z.B. bei der Videoaufnahme in der GameBar ohne gefordert GK keine Aufnahme. MS könnte dann auf RenderTargetBitmap ausweichen oder eine andere DirectX Funktion um ein Screenshot zu erstellen.


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Mittwoch, 13. Juni 2018 09:03
  • Du brauchst eigentlich nur sowas in der Art machen und es in ein Plugin packen

    public async void CreateScreenshot()
    {
        var dpi = Windows.Graphics.Display.DisplayInformation.GetForCurrentView();
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(Window.Current.Content);
    
        var pixel = await renderTargetBitmap.GetPixelsAsync();
        var file = await Windows.Storage.ApplicationData.Current.TemporaryFolder.CreateFileAsync("Test.png", Windows.Storage.CreationCollisionOption.ReplaceExisting);
        using (var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
        {
            var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Ignore,
                (uint)renderTargetBitmap.PixelWidth,
                (uint)renderTargetBitmap.PixelHeight,
                dpi.RawDpiX,
                dpi.RawDpiY,
                pixel.ToArray());
            await encoder.FlushAsync();
    
        }
    }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 13. Juni 2018 11:05

Alle Antworten

  • Hallo Fabiryn,

    auch bei mir läuft das nicht. Es ist ja die selbe Funktion die man in der App mit Win+G aufrufen kann. Warum das nicht geht, kann ich wegen fehlender Dokumentation nicht sagen.

    Es gibt aber andere mittel und Wege ein Screenshot der App zu erstellen. Z.B. kann man das mit RenderTargetBitmap erreichen. Das funktioniert sehr gut und ohne Probleme 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Dienstag, 12. Juni 2018 21:04
  • Hallo Thomas,

    leider bewege ich mich in einem Web-Umfeld (Hybride App), wodurch das RenderTargetBitmap auch nicht klappt. Ionic ist das genutzte Framework - im Endeffekt wird hier ein interner Browser gestartet, der die App dann anzeigt.

    Wo wäre denn die beste Stelle diesen Bug in der API zu reporten? Oder gibt es eventuell noch eine andere Lösung, mit der man ein Screenshot erreichen könnte?

    Viele Grüße

    Fabiryn

    Mittwoch, 13. Juni 2018 08:26
  • Mit Cordova hat man doch die Möglichkeit ein plugin zu schreiben das man dann mit Ionic nutzen kann. Eine andere Möglichkeit fällt mir auch nicht ein. Funktioniert den das fertige Plugin von Cordova nicht Link.

    Du könntest versuchen auf UserVoice den Fehler zu melden. Aber Du hast schon auf Github keine Antwort bekommen. Ich vermute das es auf UserVoice nicht anders sein wird.

    Es muss auch gar kein Fehler sein. Vielleicht ist für die Nutzung dieser Funktion eine entsprechende Grafikkarte nötig. So ist es z.B. bei der Videoaufnahme in der GameBar ohne gefordert GK keine Aufnahme. MS könnte dann auf RenderTargetBitmap ausweichen oder eine andere DirectX Funktion um ein Screenshot zu erstellen.


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Mittwoch, 13. Juni 2018 09:03
  • Das erste Plugin ist das bisher genutzte, welches unsere Firma theoretisch auch weiter pflegt. Hier wurde die oben genannte Funktion eingefügt und das hat bis 1803 auch funktioniert.

    Ich werde dann nochmal in Richtung RenderTargetBitmap und eventuell mir die neue ScreenCapture API von 1803 anschauen. Beim zweiteren bin ich mir aber nicht sicher, ob man hier ein einfachen Screenshot machen kann.

    Vielen Dank schon mal für die Hinweise.

    Viele Grüße

    Fabiryn

    Mittwoch, 13. Juni 2018 09:18
  • Ich weiß jetzt nicht welche Capture Du meinst, die ScreenCapture aus Windows.Media.Capture ist nur für Win 8.1. Die aus Windows.Graphics.Capture ist eigentlich nur für Desktop/Tablet und erfordert Win Pro oder Enterpriese. Für ein Screenshot ist das ganze auch nicht gedacht, sondern zur Aufzeichnung eines Fensters oder dem Monitor. Der Benutzer muss auch ein Fenster auswählen. Ohne dem Benutzer geht hier nix. Siehe auch hier Link

     

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 13. Juni 2018 10:01
  • oh, ja damit hätte sich Option zwei direkt erledigt.
    Mittwoch, 13. Juni 2018 10:03
  • Du brauchst eigentlich nur sowas in der Art machen und es in ein Plugin packen

    public async void CreateScreenshot()
    {
        var dpi = Windows.Graphics.Display.DisplayInformation.GetForCurrentView();
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(Window.Current.Content);
    
        var pixel = await renderTargetBitmap.GetPixelsAsync();
        var file = await Windows.Storage.ApplicationData.Current.TemporaryFolder.CreateFileAsync("Test.png", Windows.Storage.CreationCollisionOption.ReplaceExisting);
        using (var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
        {
            var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Ignore,
                (uint)renderTargetBitmap.PixelWidth,
                (uint)renderTargetBitmap.PixelHeight,
                dpi.RawDpiX,
                dpi.RawDpiY,
                pixel.ToArray());
            await encoder.FlushAsync();
    
        }
    }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 13. Juni 2018 11:05