Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows. Graphics.Capture ad alanı, bir görüntü veya uygulama penceresinden çerçeve almak, işbirliğine dayalı ve etkileşimli deneyimler oluşturmak için video akışları veya anlık görüntüler oluşturmak için API'ler sağlar.
Ekran yakalama ile geliştiriciler, son kullanıcıların yakalanacak ekranı veya uygulama penceresini seçmesi için güvenli sistem kullanıcı arabirimini çağırır ve etkin olarak yakalanan öğenin çevresinde sistem tarafından sarı bir bildirim kenarliği çizilir. Birden çok eşzamanlı yakalama oturumu söz konusu olduğunda, yakalanan her öğenin çevresine sarı bir kenarlık çizilir.
Note
Ekran yakalama API'leri yalnızca Windows masaüstü cihazlarda ve Windows Mixed Reality çevreleyici kulaklıklarda desteklenir.
Bu makalede, görüntü veya uygulama penceresinin tek bir görüntüsünü yakalama açıklanmaktadır.
Ekran yakalama desteği olup olmadığını denetleyin
Yakalamayı denemeden önce, geçerli cihazın ekran yakalamayı destekleyip desteklemediğini denetleyin. Ekran yakalamanın kullanılabilir olup olmadığını belirlemek için GraphicsCaptureSession üzerinde IsSupported yöntemini kullanın:
// Check if screen capture is supported
if (!GraphicsCaptureSession.IsSupported())
{
// Hide capture UI
CaptureControlsPanel.Visibility = Visibility.Collapsed;
PreviewPlaceholderText.Text = "Screen capture isn't supported on this device.";
UpdateStatus("Screen capture isn't supported on this device.");
return;
}
Cihazın donanım gereksinimlerini karşılamaması da dahil olmak üzere ekran yakalamanın desteklenmemesi için çeşitli nedenler vardır.
Ekran yakalamayı başlatmak için sistem kullanıcı arabirimini başlatma
Sistem seçici kullanıcı arabirimini çağırmak için GraphicsCapturePicker sınıfını kullanın. Son kullanıcı, yakalamak üzere görüntü veya uygulama penceresini seçmek için bu kullanıcı arabirimini kullanır. Seçici, yakalama oturumu oluşturmak için kullanılan bir GraphicsCaptureItem döndürür.
WinUI 3 uygulamasında PickSingleItemAsync çağrısından önce seçiciyi pencere tutamacı ile başlatmanız gerekir:
// Launch picker and start capture
var picker = new GraphicsCapturePicker();
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
GraphicsCaptureItem item = await picker.PickSingleItemAsync();
if (item != null)
{
StartCaptureInternal(item);
}
Bir yakalama kare havuzu ve yakalama oturumu oluşturun
GraphicsCaptureItem kullanarak D3D cihazınız, desteklenen bir piksel biçimi (DXGI_FORMAT_B8G8R8A8_UNORM), istenen kare sayısı (herhangi bir tamsayı olabilir) ve çerçeve boyutu ile bir Direct3D11CaptureFramePool oluşturun. GraphicsCaptureItem sınıfının Size özelliği, çerçevenizin boyutu olarak kullanılabilir:
// Create frame pool and capture session
_framePool = Direct3D11CaptureFramePool.Create(
_canvasDevice,
CaptureDirectXPixelFormat.B8G8R8A8UIntNormalized,
BufferCount,
item.Size);
_session = _framePool.CreateCaptureSession(item);
Note
Windows HD rengi etkinleştirilmiş sistemlerde içerik pikseli biçimi DXGI_FORMAT_B8G8R8A8_UNORM olmayabilir. HDR içeriği yakalarken piksellerin aşırı kırpılmasını önlemek için (yani yakalanan içeriğin soluk görünmesi), DXGI_FORMAT_R16G16B16A16_FLOAT biçimini, Direct3D11CaptureFramePool ve CanvasBitmap gibi hedefler dahil olmak üzere, yakalama işlem hattındaki tüm bileşenlerde kullanmayı göz önünde bulundurun. ihtiyaca bağlı olarak, HDR içerik biçimine kaydetme veya HDR-SDR ton eşlemesi gibi ek işlemler gerekebilir. Bu makalede SDR içerik yakalamaya odaklanılır. Daha fazla bilgi için bkz. DirectX'i yüksek dinamik aralıklı ekranlarla ve gelişmiş renkle kullanma.
Kullanıcı bir uygulama penceresini yakalama veya sistem kullanıcı arabiriminde görüntüleme için açıkça onay verdikten sonra , GraphicsCaptureItem birden çok yakalama oturumuyla ilişkilendirilebilir. Bu şekilde uygulamanız çeşitli deneyimler için aynı öğeyi yakalamayı seçebilir.
Yakalama karelerini al
Çerçeve havuzunuz ve yakalama oturumunuz oluşturulduktan sonra, sistemi uygulamanıza yakalama kareleri göndermeye başlamasını bildirmek için GraphicsCaptureSession örneğinizde StartCapture'ı çağırın.
Direct3D11CaptureFrame nesneleri olan bu yakalama çerçevelerini almak için Direct3D11CaptureFramePool.FrameArrived olayını kullanın:
// Handle frame arrival
_framePool.FrameArrived += OnFrameArrived;
FrameArrived için UI iş parçacığında ağır işlemler yapmaktan kaçınmanız önerilir; çünkü bu olay, her yeni çerçeve hazır olduğunda tetiklenir. FrameArrived'i UI iş parçacığında dinlemeyi seçerseniz, olay her tetiklendiğinde ne kadar işlem yaptığınıza dikkat edin.
Alternatif olarak, ihtiyacınız olan tüm çerçeveleri elde edene kadar Direct3D11CaptureFramePool.TryGetNextFrame yöntemiyle çerçeveleri el ile çekebilirsiniz.
Direct3D11CaptureFrame nesnesi ContentSize, Surface ve SystemRelativeTime özelliklerini içerir. SystemRelativeTime, diğer medya öğelerini eşitlemek için kullanılabilen QPC (QueryPerformanceCounter) zamanıdır.
Yakalama karelerini işle
Direct3D11CaptureFramePool'daki her çerçeve, TryGetNextFrame çağrıldığında havuzdan alınır ve Direct3D11CaptureFrame nesnesinin yaşam süresine bağlı olarak geri verilir. Yönetilen uygulamalar için Direct3D11CaptureFrame.Dispose yöntemini kullanmanız önerilir. Direct3D11CaptureFrame, IDisposable arabirimini uygular; bu nedenle çerçeve serbest bırakıldığında arabellek havuza geri döndürülür.
Uygulamalar, Direct3D11CaptureFrame nesnelerine referans kaydetmemeli; ayrıca çerçeve geri teslim edildikten sonra altta yatan Direct3D yüzeyine referans da kaydetmemelidir.
Bu örnekte her çerçeve, Win2D kitaplığının parçası olan bir CanvasBitmap'e dönüştürülür:
// Convert frame to Win2D bitmap and display
CanvasBitmap canvasBitmap = CanvasBitmap.CreateFromDirect3D11Surface(
_canvasDevice,
frame.Surface);
Temeldeki Direct3D yüzeyi, Direct3D11CaptureFramePool oluşturulurken (veya yeniden oluşturulurken) belirtilen boyutta her zaman olur. İçerik çerçeveden büyükse, çerçeve boyutuna sığmayan kısımlar kırpılır. İçerik çerçeveden küçükse, çerçevenin geri kalanı tanımlanmamış veriler içerir. Uygulamaların tanımlanmamış içerik göstermesini önlemek için bu Direct3D11CaptureFrame için ContentSize özelliğini kullanarak bir alt kayıt kopyalaması önerilir.
Ekran görüntüsü kaydetme
CanvasBitmap'iniz olduktan sonra bunu görüntü dosyası olarak kaydedebilirsiniz. Aşağıdaki örnek, geçerli çerçeveyi FileSavePicker kullanarak PNG dosyası olarak kaydeder. WinUI 3 uygulamasında seçiciyi pencere tutamacı ile başlatmanız gerekir:
// Save screenshot
var savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
savePicker.SuggestedFileName = "screen-capture";
savePicker.FileTypeChoices.Add("PNG image", new List<string> { ".png" });
WinRT.Interop.InitializeWithWindow.Initialize(savePicker, _hwnd);
StorageFile? file = await savePicker.PickSaveFileAsync();
if (file is not null)
{
using var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite);
await frameToSave.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}
Öğe yeniden boyutlandırma veya cihaz kaybı yakalamaya tepki verme
Yakalama işlemi sırasında uygulamalar Direct3D11CaptureFramePool özelliklerini değiştirmek isteyebilir. Bu, yeni bir Direct3D cihazı sağlamayı, çerçeve arabelleklerinin boyutunu değiştirmeyi ve hatta havuzdaki arabellek sayısını değiştirmeyi içerir. Bu senaryoların her birinde Direct3D11CaptureFramePool nesnesinde Yeniden Oluşturma yöntemi önerilen yaklaşımdır.
Yeniden Oluştur çağrıldığında, var olan tüm çerçeveler atılır. Bu, altta yatan Direct3D yüzeyleri uygulamanın artık erişemeyebileceği bir cihaza ait olan çerçevelerin verilmesini önlemek içindir. Bu nedenle, Yeniden Oluştur'a çağırmadan önce bekleyen tüm çerçeveleri işlemek akıllıca olabilir.
WinUI 3 ile ilgili dikkat edilmesi gerekenler
Ekran yakalama kodunu UWP'den WinUI 3'e (Windows Uygulama SDK'sı) geçirirken aşağıdaki farkları göz önünde bulundurun:
- Pencere tanıtıcısı başlatma — GraphicsCapturePicker ve FileSavePicker gibi seçiciler, InitializeWithWindow kullanılarak pencere tanıtıcısıyla başlatılmalıdır. Daha fazla bilgi için bkz. Pencere tutamacını alma (HWND).
- Ui iş parçacığındaki oluşturma API'leri — WinUI 3'te CanvasComposition yüzey işlemleri ( CompositionDrawingSurface'e çizim gibi) DispatcherQueue.TryEnqueue kullanılarak kullanıcı arabirimi iş parçacığına gönderilmelidir. Çerçeve yakalama ve bit eşlem oluşturma, çerçeve havuzunun arka plan iş parçacığında gerçekleşebilir, ancak oluşturma görselinin güncelleştirilmesi ui iş parçacığında gerçekleşmelidir.
-
Namespace changes —
Microsoft.UI.Compositionkarşılıkları yerineMicrosoft.UI.Xaml.Hosting,Microsoft.UI.DispatchingveWindows.UIkullanın.Windows.Graphics.Capturead alanı değişmeden kalır.
Ayrıca bakınız
- Windows. Graphics.Capture ad alanı
- WinUI 3 için Win2D
- Bir pencere tutamağını (HWND) alın
- Grafikler — Windows uygulamaları için grafik geliştirme özellikleri dizini
- GitHub Üzerinde DirectX Grafik Örnekleri
Windows developer