2013-08-25 13 views
5

Sto cercando di ottenere la posizione assoluta di un controllo sullo schermo. Sto usando due monitor e i risultati non sono poi così grandi ...C# posizione assoluta del controllo sullo schermo

Quello che sto facendo è aprire un altro modulo per catturare un'immagine, quindi passare questa immagine alla forma principale e chiudere il modulo di acquisizione. Quindi desidero che il modulo principale appaia nello stesso luogo in cui è stata catturata l'immagine. Per avere un'idea di cosa sto cercando di fare come esempio, apri lo strumento di cattura su Windows e cattura uno snip. La finestra verrà quindi visualizzata nel punto in cui è stata scattata l'immagine.

Questo è il codice corrente che sto usando per fare questo:

Location = new Point(Cursor.Position.X - CaptureBox.Width - CapturePanel.Location.X - CaptureBox.Location.X - 8, Cursor.Position.Y - CaptureBox.Height - CapturePanel.Location.Y - CaptureBox.Location.Y - 30); 

CapturePanel contiene il controllo CaptureBox che memorizza l'immagine. Sto anche prendendo 8 dalla posizione X e 30 dalla posizione Y per compensare il bordo del modulo e la barra del titolo, ma l'unico problema è che alcuni computer useranno uno stile di finestra diverso, e questi numeri cambieranno.

Se esiste un metodo che può essere utilizzato per afferrare il bordo e la larghezza/altezza del titolo di Windows, sarebbe fantastico.

EDIT

Una soluzione a questo sarebbe:

Location = new Point(
    Cursor.Position.X - 
    CaptureBox.Width - 
    CapturePanel.Location.X - 
    CaptureBox.Location.X - 
    SystemInformation.HorizontalResizeBorderThickness, 
    Cursor.Position.Y - 
    CaptureBox.Height - 
    CapturePanel.Location.Y - 
    CaptureBox.Location.Y - 
    SystemInformation.CaptionHeight - 
    SystemInformation.VerticalResizeBorderThickness 
); 

Con l'aiuto di Re Re sottolineando SystemInformation a me.

risposta

5

Per ottenere l'Height del vostro Window caption, si può provare questo:

int captionHeight = yourForm.PointToScreen(Point.Empty).Y - yourForm.Top;  

Per ottenere l'Width della forma di confine, si può provare questo:

int borderWidth = yourForm.PointToScreen(Point.Empty).X - yourForm.Left; 

Inoltre si può decidere di guarda l'altezza della didascalia predefinita di SystemInformation.CaptionHeight.

Se si desidera ottenere la posizione del CaptureBox nelle coordinate dello schermo, è possibile utilizzare il metodo PointToScreen:

Point loc = CaptureBox.PointToScreen(Point.Empty); 
+0

Il primo metodo funziona, SystemInformation.CaptionHeight era più piccolo di quanto dovrebbe essere. E le dimensioni del bordo della finestra? – Dragonphase

+0

@Dragonphase se si desidera ottenere la posizione di 'CaptureBox', vedere la mia risposta aggiornata, non è necessario calcolare la' Dimensione bordo '. –

+0

Questo non funzionerà, dal momento che non sto passando la posizione dell'immagine catturata al modulo principale. Se lo faccio, risulta nella posizione assoluta (ad esempio, 1440) che viene aggiunta alla posizione del modulo attualmente selezionato sul monitor principale. Ho trovato una soluzione, tuttavia, è nel mio post principale. – Dragonphase