PhysicalToLogicalPointForPerMonitorDPI 函式 (winuser.h)

將視窗中的點從實體座標轉換成邏輯座標,不論每英吋的點數 (DPI) 呼叫者感知。 如需 DPI 感知等級的詳細資訊,請參閱 PROCESS_DPI_AWARENESS

語法

BOOL PhysicalToLogicalPointForPerMonitorDPI(
  [in]      HWND    hWnd,
  [in, out] LPPOINT lpPoint
);

參數

[in] hWnd

用於轉換之視窗的控制碼。

[in, out] lpPoint

POINT結構的指標,指定要轉換的實體/螢幕座標。 如果函式成功,新的邏輯座標就會複製到這個結構中。

傳回值

如果成功,則傳回 TRUE ,否則傳回 FALSE

備註

在Windows 8中,系統 DPI 感知應用程式會使用PhysicalToLogicalPointLogicalToPhysicalPoint在實體和邏輯空間之間轉譯。 在Windows 8.1中,系統的額外虛擬化和處理序間通訊表示對於大部分的應用程式而言,您不需要這些 API。 因此,在Windows 8.1中,這些 API 不再轉換點。 系統會將所有點傳回至其本身座標空間中的應用程式。 此行為會保留大部分應用程式的功能,但有一些例外狀況,您必須進行變更,以確保應用程式如預期般運作。

例如,應用程式可能需要逐步執行另一個程式的整個視窗樹狀結構,並要求系統提供視窗的 DPI 相依資訊。 根據預設,系統會根據呼叫端的 DPI 感知傳回信息。 這適用于大部分的應用程式。 不過,呼叫端可能需要根據與視窗相關聯之應用程式的 DPI 感知資訊。 這可能是必要的,因為兩個應用程式會直接彼此傳送 DPI 相依資訊。 在此情況下,應用程式可以使用 LogicalToPhysicalPointForPerMonitorDPI 來取得實體座標,然後使用 PhysicalToLogicalPointForPerMonitorDPI 根據所提供 HWND的 DPI 感知,將實體座標轉換成邏輯座標。

請考慮 兩個應用程式 ,其中一個PROCESS_DPI_AWARENESS值為 PROCESS_DPI_UNAWARE ,另一個應用程式的值則為 PROCESS_PER_MONITOR_AWAREPROCESS_PER_MONITOR_AWARE應用程式會在縮放比例為 200% (192 DPI) 的單一監視器上建立視窗。 如果這兩個應用程式在此視窗上呼叫 GetWindowRect ,它們將會收到不同的值。 PROCESS_DPI_UNAWARE應用程式會根據 96 DPI 座標收到矩形,而PROCESS_PER_MONITOR_AWARE應用程式會收到符合監視器實際 DPI 的座標。 如果 PROCESS_DPI_UNAWARE 需要系統傳回 給PROCESS_PER_MONITOR_AWARE 應用程式的 rect,它可以呼叫 LogicalToPhysicalPointForPerMonitorDPI 作為其 rect 的角落,並將控制碼傳遞至 PROCESS_PER_MONITOR_AWARE 應用程式的視窗。 這會根據可用來建立 Rect 的其他應用程式感知傳回點。 這是因為 PROCESS_PER_MONITOR_AWARE 會使用監視器的實際 DPI,因此邏輯和實體座標完全相同。

規格需求

   
最低支援的用戶端 Windows 8.1 [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2012 R2 [僅限傳統型應用程式]
目標平台 Windows
標頭 winuser.h
程式庫 User32.lib
Dll User32.dll
API 集合 ext-ms-win-ntuser-window-l1-1-4 (于 Windows 10 10.0.14393 版)

另請參閱

LogicalToPhysicalPointForPerMonitorDPI

PROCESS_DPI_AWARENESS