2014-09-01 2 views
1

Stackoverflow répond à plusieurs questions sur la façon de convertir l'écran en coordonnées WPF, si une fenêtre visible est disponible.Convertir l'écran en coordonnées WPF sans afficher de fenêtre

Comment pouvez-vous faire la conversion si vous n'avez pas ont une fenêtre visible (pour, dans mon cas, une application de plateau)?

J'ai essayé la méthode très inélégant de créer une fenêtre factice cachée,

var w = new Window(); 
w.Visibility = Visibility.Hidden; 
presentationSource = PresentationSource.FromVisual(w); 
var transform = presentationSource.CompositionTarget.TransformToDevice; 
w.Close(); 

Cela ne fonctionnera pas. La fenêtre w doit être affichée, w.Show(), pour que PresentationSource.FromVisual fonctionne. J'ai également essayé w.PointFromScreen(point), mais cela déclenche une exception si le w n'est pas affiché.

+1

Voir [cette question] (http://stackoverflow.com/q/24441443/1136211). – Clemens

Répondre

1

La moitié de la réponse est dans le lien de Clemens dans les commentaires ci-dessus, ce qui est toute réponse:

D'abord, vous devez faire référence GetSystemMetrics dans USER32, de sorte que vous pouvez obtenir les dimensions de l'écran physique:

public static int SM_CXSCREEN = 0; // GetSystemMetrics index. 
[DllImport("USER32.DLL", SetLastError = true)] 
public static extern int GetSystemMetrics(int nIndex); 

Ensuite, obtenir le rapport entre WPF pixels logiques et les pixels physiques:

double widthInDevicePixels = WinApi.GetSystemMetrics(WinApi.SM_CXSCREEN); 
double widthInDIP = SystemParameters.WorkArea.Right; // Device independent pixels. 
double scalingFactor = widthInDIP/widthInDevicePixels; 

... et voilà:

double wpfLogicalPixel = devicePixel * scalingFactor; 
Questions connexes