2015-12-19 36 views
6

Voglio fare un'applicazione SS. Ma ho problemi su questo argomento. Voglio che l'utente sia in grado di selezionare un'area speciale per fare screenshot. Voglio anche che il desktop sia attivo mentre l'utente sta selezionando l'area. Ad esempio, l'utente vuole prendere un SS del frame specifico di un video. L'utente deve essere in grado di farlo mentre il video è in riproduzione. Ho provato questo utilizzando il disegno direttamente sul desktop. Ma sfarfallio così tanto. Come posso risolvere questo problema o esiste un modo alternativo?Come fare una selezione dell'area screenshot disegnando sul desktop per fare screenshot?

Il mio codice:

[DllImport("User32.dll")] 
    static extern IntPtr GetDC(IntPtr hwnd); 

    [DllImport("user32.dll")] 
    static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase); 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Load += Form1_Load; 
    } 

    void Form1_Load(object sender, EventArgs e) 
    { 
     Start(); 
    } 

    IntPtr handle; 
    Graphics grp; 

    void Start() 
    { 
     handle = GetDC(IntPtr.Zero); 
     grp = Graphics.FromHdc(handle); 
     grp.SmoothingMode = SmoothingMode.HighQuality; 
     timer2.Start(); 
    } 
    private void timer2_Tick(object sender, EventArgs e) 
    { 

     grp.DrawLine(Pens.Red, 0, Cursor.Position.Y, Screen.PrimaryScreen.Bounds.Width, Cursor.Position.Y); 
     InvalidateRect(IntPtr.Zero, IntPtr.Zero, false); 
    } 
+3

FYI - [Greenshot] (http://getgreenshot.org/) lo fa ed è un codice .NET gratuito e open source. Puoi semplicemente "sbirciare" dal loro codice. – ja72

risposta

5

creare la forma con sfondo semi-trasparente (o completamente trasparente), che è sempre-on-top, senza bordi e delle dimensioni del desktop. Effettua qualsiasi grafica di selezione del rettangolo di schermate (ad esempio rettangolo selezionato + guide + lente d'ingrandimento, completamente opaco) su quella forma. Quando la selezione è fatta dall'utente, nascondi il modulo e prendi lo screenshot.

+1

Se non ho frainteso, il disegno semitrasparente è di nuovo trasparente quanto il modulo. Quando imposto l'opacità del modulo su 0.1 il rettangolo di selezione non sembra vivo. D'altra parte non sono riuscito a ottenere il disegno su una forma completamente trasparente. Sei in grado di dare un esempio di codice? –

+1

@AliTor - Lo so, l'ho semplificato nella mia spiegazione originale. La forma semitrasparente funzionerebbe come dici tu, ma un approccio migliore è una forma opaca con sfondo trasparente, quindi solo i suoi controlli (ad esempio linee guida o cornice di selezione) rimarranno opachi. Puoi dare un'occhiata ad alcuni strumenti esistenti che utilizzano con successo questo approccio, ad es. SnagIt. – miroxlav

+1

Ok, l'ho fatto. Ho sbagliato a fare la differenza tra l'impostazione dell'opacità e l'impostazione del tasto trasparenza per la trasparenza. L'ho fatto impostando il backcolor del modulo come valore della chiave di trasparenza. Grazie @miroxlav. –