2009-04-21 12 views
5

Sto scrivendo un'applicazione Windows. Come posso sapere quando ne viene preso uno screenshot? Ho letto su come rilevare il tasto di scelta rapida premuto, ma sono più preoccupato per il caso in cui ogni 100 ms o giù di lì un altro programma sta prendendo screenshot di esso. Vale a dire, sto cercando di notare quando qualcuno crea un altro programma (ad esempio uno python con ImageGrab, come menzionato in un altro post) che prende costantemente screenshot della mia app e li usa per leggere informazioni al di fuori di esso.Rileva quando gli utenti acquisiscono schermate del mio programma

Non mi interessa molto impedire che vengano catturati gli screenshot: posso solo escludere l'utente una volta rilevato questo comportamento.

È possibile? C'è un messaggio di Windows inviato quando un'app prende uno screenshot, come con WM_HOTKEY? Oppure Windows usa solo le ultime informazioni degli ultimi eventi di pittura e lo restituisce direttamente all'altro programma, senza che la mia app possa notarlo del tutto?

+0

Vuoi vietare le persone che catturano screenshot della tua app? – jjnguy

+0

Molto strettamente correlati: http://stackoverflow.com/questions/767212/programatticamente-scegliere-screenshots-in-windows-without-the-application-noticing –

+0

@jinguy: questa sarebbe una cosa molto utile da fare per un'applicazione che visualizza dati sensibili ... –

risposta

27

Qualunque cosa tu faccia, la gente troverà un modo per aggirarla. Supponiamo che esistesse un tale metodo, in cui potresti rilevare in modo affidabile un altro programma che cattura uno screenshot della tua applicazione. Per ovviare a questo, potrei installare VirtualBox, eseguire la tua applicazione all'interno della VM e poi fare in modo che un programma faccia screenshot di VirtualBox (che quindi contiene la tua applicazione). La tua applicazione non avrebbe assolutamente modo di sapere che stava facendo la sua foto.

+0

A meno che VirtualBox non simuli l'acquisizione di schermate allo stesso modo di Windows. Dalla tua risposta, stai dicendo che non è così? – Claudiu

+0

Non sto parlando di VirtualBox che cattura lo screenshot; Sto parlando di un altro programma che cattura uno screenshot * di * VirtualBox. Dopotutto, VirtualBox è fondamentalmente solo una finestra con alcuni pixel al suo interno. –

+0

Ecco cosa intendevo. Nella mia testa, viene chiamata una certa funzione quando viene chiamato "takeScreenshot()". Questa funzione richiama in modo ricorsivo il "takeScreenshot()" di tutte le finestre aperte (quindi il desktop lo chiamerebbe su tutti i programmi con le finestre aperte). VirtualBox potrebbe definire il suo gestore per "takeScreenshot()" per simulare la chiamata di "takeScreenshot()" su tutte le app che sta simulando. Non sono sicuro se questo è il modo in cui funziona, ed è per questo che sto chiedendo qui. – Claudiu

7

Cosa succede se uso una videocamera? Cosa succede se catturo il video che arriva tra il computer e il monitor?

Sarò sorpreso di sapere che c'è un modo pratico per farlo.

+11

ancora lavorando su quel prototipo di braccio bionico che si travestirà da dongle di licenza! Sarà solo strangolare l'utente se tentano di utilizzare il video corder o fotocamera. –

+1

+1 per Dr.Il male per farmi davvero ridere – Tokk

1

Il modo in cui di solito faccio screenshot (da C#) è chiamando BitBlt, che è la base di molte immagini su schermo. Non sei sicuro di come intercettare le chiamate in modo significativo, dal momento che probabilmente ogni programma del sistema lo utilizza a un livello basso.

+0

Ho visto una prova di codice concettuale in un programma cheat sparatutto in prima persona, che ha congelato il thread dello screenshot fino a quando l'imbroglione non era stato disabilitato. Penso che abbia agganciato BitBlt o qualcosa di simile. –

2

È piuttosto difficile fermarlo completamente ... Un utente sufficientemente determinato potrebbe semplicemente scattare una foto dello schermo con una fotocamera digitale.

1

Presumo che non si possa proprio perché è sempre possibile eseguire il programma in una finestra con la macchina virtuale, quindi utilizzare un programma di acquisizione sulla piattaforma esterna e sapere se ciò sta accadendo è molto difficile. Suggerisco di pensare di più in modi di ritmo speciale di rendering o interlacciamento, contrasti speciali, ecc ...

È anche possibile eseguire le uscite sullo schermo come se fosse un film, codificarlo con un codificatore di bassa velocità e risoluzione, in modo che una cattura ancora ogni 100 ms sarà di qualità così bassa che sarebbe inutile. (hai mai congelato un film di bassa qualità?)

tuttavia dovresti davvero considerare l'uso di altri modi per proteggere le tue informazioni.

7

Questo non funzionerà mai. Non solo, ma i tentativi di fornire questo livello di sicurezza arrecheranno inconvenienti al 99% dei tuoi utenti legittimi.

Forse è meglio affrontare il problema dal punto di vista del tentativo di identificare usi/copie indesiderati delle informazioni e avvicinarsi alle persone/aziende che utilizzano tali informazioni.

La legge sul copyright è appropriata per questo approccio, ma capisco che ci sono alcuni punti in cui questo approccio non è disponibile.

3

In primo luogo, i commenti sull'utilizzo di una macchina virtuale sono completamente inutili: è molto più facile rilevare le finestre in esecuzione con un virtualizzatore piuttosto che rilevare uno screenshot.

Un buon modo per rendere difficili gli screenshot sarebbe quello di riscrivere il programma per l'esecuzione in modalità schermo intero con alcuni dos extender ancestral.

Un buon modo per vietare il 95% degli utenti che hanno mai tentato di scattare uno screenshot è di visualizzare un enorme banner lampeggiante all'avvio ("schermate vietate! Essere bannato!") E rilevare l'utente premendo PrtScrn nei seguenti 15 secondi.

+0

Hah a l'ultimo paragrafo =). – Claudiu

+0

Mi chiedo solo perché questo abbia avuto così pochi voti ... –

+0

"molto più facile rilevare le finestre in esecuzione con un virtualizzatore" - sì, quindi sto eseguendo la mia copia legittimamente concessa di WinXP in una VM su Linux; e il tuo punto è ...? – Piskvor

2

Un'altra ragione per cui penso che sarà impossibile raggiungere questo obiettivo:

Molto tempo fa, non sono riuscito a fare una cattura dello schermo del contenuto di Windows Media Player, perché (ho assunto) WMP in streaming che il contenuto alla videocard subito. (Dettagli divertenti: dopo aver incollato la cattura dello schermo, il video continuerà a essere riprodotto in MS Paint, ma il salvataggio dell'immagine produrrebbe un quadrato nero). In ogni caso, l'utilizzo di VNC ha reso molto facile ottenere l'acquisizione dello schermo dopo tutto.

+0

La stessa cosa è successa anche a me. Mi sono sempre chiesto perché. – Claudiu

+3

Non credo che Media Player faccia questo per prevenire gli screenshot - questo è un effetto collaterale. Qualsiasi overlay del genere non può essere catturato normalmente. Tuttavia, se si disattiva l'accelerazione hardware, non verrà utilizzato l'overlay e sarà possibile eseguirne uno screenshot. –

+0

In effetti, penso anche che sia un effetto collaterale. (Anche se Microsoft potrebbe desiderare di interrompere la registrazione dello schermo per i contenuti protetti da DRM.) – Arjan

4

È possibile (in modo inaffidabile) eseguire questa operazione utilizzando SetWindowsHookEx.

Here is a complete VB.NET example.

Tuttavia, ci sono molti modi per aggirare questo. Un gancio installato dopo il tuo "sostituirà" il tuo hook. Gli utenti possono scattare foto del proprio schermo in molti modi, come descritto in questa discussione. Proverò a considerare altre opzioni di protezione oltre a questo.

-1

c'è un modo che penso possa fermarlo. conoscere la tecnologia che offusca un display grafico quando viene duplicato, ad esempio.

screenshot, fotografato dalla fotocamera digitale schermata da sistema operativo virtuale.

giocare con esso, chi sa che potresti inventare qualcosa che ti farà milioni.

+0

"sfoca un display grafico quando è duplicato": si tratta di fantascienza, non di tecnologia reale. I bit che diventano l'immagine di visualizzazione vengono duplicati e modificati molto prima di passare dal programma attraverso il sistema operativo all'hardware. Il vero problema qui è decifrare l'intento, che è abbastanza difficile con gli umani, per non parlare delle istruzioni del computer. – Piskvor

Problemi correlati