2010-02-09 17 views
5

Vorrei eseguire il rendering di una singola immagine utilizzando DirectX. Dovrebbe funzionare in modo simile all'uscita "directx video" del lettore VLC, se non fosse possibile acquisire una cornice usando un semplice software di cattura dello schermo o la chiave di stampa. Non dovrebbe essere possibile (o molto difficile) fare uno screenshot!Previene la cattura dello schermo con DirectX

Qualcuno sa come funziona nel lettore VLC?

Esistono altre soluzioni possibili? Forse con "Output Protection Manager" (vedi http://msdn.microsoft.com/en-us/library/dd388980(VS.85).aspx)

Ho circa 3 anni di esperienza di programmazione C# guadagnati a scuola. Ho anche fatto qualche programmazione in C++, ma preverò una soluzione C# magari usando WPF o Managed DirectX.

Scusate il mio inglese e grazie per il vostro aiuto in anticipo !!!

risposta

1

Forse con il suono di esso è necessario intercettare WM_PRINTCLIENT agganciando in una procedura di Windows globale, se viene utilizzato il messaggio WM_PRINTCLIENT, basta tornare dalla procedura della finestra agganciata. Vedi qui per un'informazione dettagliata di Feng Yuan su WM_PRINTCLIENT. L'altro modo per farlo è intercettare le funzioni degli appunti in cui i dati provengono da una particolare applicazione e gli appunti contengono una bitmap. Vedi il blog di Larry Osterman a proposito di this. Ecco un articolo su CodeProject che implementa un hook globale di Windows, ci sono altri due collegamenti che potrei fornire here e here. (Tutto su CodeProject)

Spero che questo aiuti, Cordiali saluti, Tom.

+0

Ho provato a cavarsela con WM_PRINTCLIENT ma non ho mai avuto il WM_PRINTCLIENT messaggio. Ho usato il protetta override void WndProc (ref Message m) della finestra principale nella mia applicazione Intercettare functios appunti non funziona a causa dello schermo cattura software non sempre sicura la bitmap di cattura negli appunti (vedi Windows 7 Snipping Tool Options per esempio). – raisyn

+0

@youllknow: Se si guarda l'ultimo collegamento per CodeProject, c'è un gancio per gli appunti ... Poiché non ho Windows 7 non posso dire come funziona ... :) – t0mm13b

+0

Sì, c'è, ma uno schermo il software di acquisizione (ad esempio Snipping Tool) non utilizza gli Appunti. Quindi il gancio non verrà mai eseguito! Ma grazie per il tuo aiuto !!! – raisyn

6

In primo luogo, il motivo per cui il contenuto di VLC non viene catturato quando si utilizza lo schermo di stampa o altre tecniche di acquisizione dello schermo è perché (almeno su versioni precedenti di Windows) utilizzano una "sovrapposizione" per presentare il video. Questo è un costrutto GPU speciale che consente il rendering su un "piano" virtuale sopra la normale superficie dello schermo. Poiché questo ignora tutto il resto e passa direttamente alla GPU, non esiste un modo semplice per catturarlo. NOTA: Nelle ultime versioni di Windows le regole sono cambiate un po 'per quanto riguarda gli overlay. Le app non possono supporre che gli overlay D3D9/DDraw siano supportati e le app non dovrebbero usarli al giorno d'oggi poiché il sistema ha metodi molto migliori per presentare contenuti con le stesse alte prestazioni.

Direct3D 9 Overlay

Se si sta visualizzando i contenuti video utilizzando Direct3D 9, è anche possibile utilizzare un overlay. Vedi this page on MSDN per informazioni su come farlo. Ci sono molte restrizioni sull'uso degli overlay D3D9 e non sono supportati su un sacco di hardware, quindi descriverò alcuni altri approcci.

Questa tecnica non impedisce ad altre app di iniettarle nello spazio degli indirizzi e catturare i regali. Inoltre, poiché non è supportato su alcuni hardware e alcune API di acquisizione disabilitano effettivamente gli overlay, non fornisce garanzie di protezione molto forti.

basata su GPU Content Protection

Se si dispone di un sacco di tempo per conoscere la protezione dei contenuti GPU e sai che ti verrà visualizzando un formato video non standard protetto da DRM, si può rotolare il vostro possiede un percorso multimediale protetto utilizzando la protezione del contenuto della GPU. Non sono un esperto in questo settore e ce ne sono pochi. Non lo consiglierei, ma volevo farlo notare.This page on MSDN parla di come è implementato in Direct3D 9 e this other page parla di come è implementato usando Direct3D 11.

Questa tecnica fornisce forti garantisce che il contenuto non è stato catturato, poiché la chiave di scambio avviene quasi interamente attraverso hardware (es. HDCP).

Media Foundation supporti protetti Path (PMP)

Se si sta visualizzando video utilizzando un formato multimediale DRM-based ben supportato, è possibile utilizzare il percorso multimediale protetto di Media Foundation, che si avvale della GPU- protezione del contenuto basata in precedenza descritta. Incapsula inoltre la maggior parte delle funzionalità in un processo protetto separato che altre app non possono intercettare o altrimenti interagire con. Se qualcuno cerca di installare un driver test-firmato o in altro modo iniettare un binario che non è il codice-firmato da un'autorità principale attendibile, Windows non consentirà il contenuto per essere decifrato e il contenuto rimarrà sicuro. Questa tecnica fornisce strong garantisce che il contenuto non sia stato acquisito. Questo è usato da Netflix su Windows, lettori Blueray e altri.

DXGI Swap a catena Bandiere

Supponendo che si sta presentando contenuti utilizzando Direct3D 10.x/11.x (e, si spera ora si sono, al contrario di D3D 9, nel 2014), è possibile utilizzare un numero di flag sulla catena di swap per bloccare il contenuto.

È possibile passare DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT nei flag catena di scambio per non riuscire nella creazione della catena di scambio se il sistema non dispone di protezione di output HDCP o HDCP. Questo probabilmente non è necessario per i tuoi scopi, ma va bene se ti preoccupi delle persone che catturano l'uscita HDMI o analogica.

La bandiera si vuole sicuramente è chiamato DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY. Ciò impedisce a tutte le API di acquisizione dello schermo di vedere mai la tua catena di scambio. Apparirà semplicemente come un rettangolo nero per loro.

Vedi this page per tutti i DXGI bandiere di swap a catena.

Questa tecnica non fornisce le solide garanzie garantite dalla protezione del contenuto basata su GPU, ma se si è abbastanza sicuri che altre app non stanno facendo cose folli come iniettarsi nello spazio degli indirizzi e agganciare le chiamate in corso, può essere sicuro che questo impedisca a chiunque altro di vedere il tuo contenuto (eccetto il monitor, ovviamente).

-Window completa protezione

A volte si potrebbe desiderare di proteggere più di contenuti solo DXGI-presentato. In tal caso, si può effettivamente fare uso di un meccanismo simile per proteggere semplicemente un'intera finestra venga catturato da varie tecniche acquisizione schermo. È un'API chiamata SetWindowDisplayAffinity. E 'equivalente in forza e funzione per passare la bandiera DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY per uno swap a catena, ma protegge anche contenuti presentati con GDI, le tecnologie DirectX più anziani, ecc passare il flag WDA_MONITOR per attivare la protezione per un dato HWND, o passare WDA_NONE per disattivare la protezione .

Per completezza di informazione, io lavoro in Microsoft sulla squadra che gestisce la logica di visualizzazione, tra cui alcune forme di cattura dello schermo e la protezione dei contenuti.

Problemi correlati