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:
- ottenere il DPI, dividerlo per 96 e moltiplicare i componenti di dimensioni (X e Y) dello schermo con questo fattore.
- 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.
Non è "complicato", devi solo disimparare alcune cattive abitudini . Potrebbe anche darsi da fare, quei monitor ad alta DPI non se ne andranno. –
@ 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. –