2015-09-07 5 views
6

Sto provando a creare uno screenshot/bitmap del mio schermo. Ho scritto questa funzione:Acquisizione di uno screenshot mediante Graphics.CopyFromScreen con ridimensionamento del 150%

public static Bitmap CreateScreenshot(Rectangle bounds) 
{ 
    var bmpScreenshot = new Bitmap(bounds.Width, bounds.Height, 
            PixelFormat.Format32bppArgb); 
    var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 
    gfxScreenshot.CopyFromScreen(bounds.X, bounds.Y, 
     0, 0, 
     new Size(bounds.Size.Width, bounds.Size.Height), 
     CopyPixelOperation.SourceCopy); 
    return bmpScreenshot; 
} 

Questa funzione viene chiamato nella mia forma di sovrapposizione che dovrebbe attirare la bitmap su se stessa. Attualmente sto usando GDI + per l'intero processo.

private void ScreenshotOverlay_Load(object sender, EventArgs e) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
     Size += screen.Bounds.Size; 
    Location = Screen.PrimaryScreen.Bounds.Location; 

    _screenshot = BitmapHelper.CreateScreenshot(new Rectangle(new Point(0, 0), Size)); 
    Invalidate(); // The screenshot/bitmap is drawn here 
} 

Sì, dispongo la bitmap in un secondo momento, quindi non preoccuparti. ;) Sul mio computer portatile e desktop questo funziona bene. Ho provato questo con diverse risoluzioni e i calcoli sono corretti. Posso vedere un'immagine dello schermo sul modulo.

Il problema inizia con Surface 3. Tutti gli elementi vengono ridimensionati di un fattore di 1,5 (150%). Ciò significa che il DPI cambia. Se provo a fare uno screenshot lì, cattura solo come la parte in alto a sinistra dello schermo ma non quella intera. Ho fatto la mia strada attraverso Google e StackOverflow e provato cose diverse:

  1. ottenere il DPI, dividerlo per 96 e moltiplicare i componenti di dimensioni (X e Y) dello schermo con questo fattore.
  2. Aggiungere una voce a application.manifest per rendere l'applicazione sensibile al DPI.

Il primo modo non ha portato il risultato desiderato. Il secondo ha fatto, ma l'intera applicazione dovrebbe essere regolata e questo è abbastanza complicato in Windows Form.

Ora la mia domanda sarebbe: c'è un modo per catturare uno screenshot dell'intero schermo, anche se ha un fattore di scala superiore a 1 (DPI più alto)? Ci deve essere un modo per farlo al fine di farlo funzionare ovunque.

Ma a questo punto non ho avuto risultati di ricerca reali che potrebbero aiutarmi. Grazie in anticipo.

+2

Non è "complicato", devi solo disimparare alcune cattive abitudini . Potrebbe anche darsi da fare, quei monitor ad alta DPI non se ne andranno. –

+1

@ HansPassant Hm, ok. Quindi non c'è nient'altro che possa probabilmente fare, ho ragione? Se è così, proverò a rendere la mia applicazione completamente compatibile con DPI. –

risposta

1

Prova questo, che si trova nella libreria di SharpAVI. Funziona bene su dispositivi indipendentemente dalla scala di risoluzione. E l'ho testato su Surface 3 al 150%.

SharpAVI può essere trovato qui: https://github.com/baSSiLL/SharpAvi E 'per i video, ma utilizza un metodo copyFromScreen simile quando ottiene ogni fotogramma:

graphics.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(screenWidth, screenHeight)); 
+1

Non so perché ho ottenuto un voto negativo qui. Attualmente in grado di ottenere uno screenshot con un fattore di scala superiore a 1 senza aggiungere una voce al manifest dell'app. – ickydime