2013-03-02 42 views
1

我對此有些迷惑。我們有一個c#/ WPF屏幕捕獲工具,它使用Graphics.CopyFromScreen抓取桌面的一部分。C#wpf窗口this.top在Win8上返回錯誤的位置?

它可以在許多不同的機器上正常工作,包括XP,Win7和至少一個Windows8虛擬機。

我們遇到了一臺擁有Win8的宏碁ZS600,而且我們看到了一個奇怪的效果,我想不出來。

當您捕捉時,它會抓取尺寸正確但位置錯誤的圖像。它偏移到頂部和左側。不是一個固定的金額。當捕獲窗口位於屏幕0,0位置時很好,但是當您將捕獲窗口從原點移開時,偏移量會增加。

我已經通過代碼,發現窗口位置(this.Top和this.Left)報告錯誤的數字。更奇怪的是,我們在Acer Z5771上試過這個,它實際上是相同的硬件設置,除了它使用Windows 7.我們嘗試更新Zs600圖形驅動程序,但它沒有任何效果。

有沒有人明白這一點,或建議修復或解決方法?

編輯:我已經把一個簡單的應用程序,在問題機器上,顯示效果。在我的開發機器上,它工作正常。在這裏下載:https://s3-eu-west-1.amazonaws.com/kdownload/Tools/CaptureTool_app.zip

或下載編譯版本:https://s3-eu-west-1.amazonaws.com/kdownload/Tools/capturetest.exe

編輯:下面是該問題的系統上使用捕獲應用程序的兩張截圖。 https://s3-eu-west-1.amazonaws.com/kdownload/Tools/ProblemScreencap.png(編輯 - 在屏幕截圖我已顯示的數字對於x & y隨寬度&高度切換,現在固定在上載的代碼,請忽略此)

+0

你能嘗試一些固定的號碼,然後看看會發生什麼? – PsyKzz 2013-03-02 19:49:35

+0

嘗試固定號碼。捕捉部分抓住屏幕的右側部分。問題是wpf窗口給了我錯誤的位置。 – Sugrue 2013-03-02 19:51:23

+0

您可以創建另一個不可見的窗口作爲您用作參考的骯髒的黑客,如果它的WPF的位置使得新窗口在左上角始終是靜態的,例如工作? – PsyKzz 2013-03-02 20:09:34

回答

4

這可能是因爲在OS Dpi設定被設定在100%以上。

您可以根據當前的操作系統分辨率製作輔助方法來檢查並轉換到正確的位置。

有點像。

public Point GetDpiSafeLocation(Point location) 
{ 
    PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow); 
    if (source != null) 
    { 
     double dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11; 
     double dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22; 
     return new Point(location.X * 96.0/dpiX, location.Y * 96.0/dpiY); 
    } 
    return location; 
} 

用法:

var point = GetDpiSafeLocation(new Point(Left, Top)); 
+0

我在哪裏可以找到dpi設置? (我是Windows 8的新手) – Sugrue 2013-03-02 22:21:57

+0

你可以在這裏找到一些信息http://nvidia.custhelp。com/app/answers/detail/a_id/3153 /〜/ adjust-windows-8-display-size%2Fscaling-for-high-dpi%2Fppi-監視器 – 2013-03-02 22:25:10

+0

是 - DPI設置爲125%。我不知道這個設置存在 - 我沒有意識到DPI和屏幕分辨率之間存在差異。謝謝。 – Sugrue 2013-03-02 22:31:32