我试图在一个没有成功的GetWindowDpiAwarenessContext应用程序中实现C#。
相关的头文件是:
windef.h
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
typedef enum DPI_AWARENESS {
DPI_AWARENESS_INVALID = -1,
DPI_AWARENESS_UNAWARE = 0,
DPI_AWARENESS_SYSTEM_AWARE = 1,
DPI_AWARENESS_PER_MONITOR_AWARE = 2
} DPI_AWARENESS;
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)WinUser.h
WINUSERAPI
DPI_AWARENESS_CONTEXT
WINAPI
GetWindowDpiAwarenessContext(
_In_ HWND hwnd);我正在使用:
/// <summary>
/// Class for native methods.
/// </summary>
internal static class NativeMethods {
[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);
...
// Dpi awareness context
IntPtr dpiAwarenessContext = NativeMethods.GetWindowDpiAwarenessContext(process.Handle);
if (dpiAwarenessContext == (IntPtr)(-1)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_UNAWARE");
} else if (dpiAwarenessContext == (IntPtr)(-2)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_SYSTEM_AWARE");
} else if (dpiAwarenessContext == (IntPtr)(-3)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE");
} else if (dpiAwarenessContext == (IntPtr)(-4)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2");
} else {
sb.AppendLine(" DPI Awareness Context failed: " + dpiAwarenessContext);
}它返回以下内容之一: 0、18、34、24592、61457,而不是预期的-1、-2、-3或-4。此外,在随后对同一窗口的调用中,返回值会发生变化。( windows在此应用程序之外的其他进程中。)
问题是定义和调用GetWindowDpiAwarenessContext的正确方法是什么。
提前谢谢。
发布于 2018-03-05 16:58:24
我还没有找到DPI_AWARENESS_CONTEXT中的确切内容。它作为句柄实现,这将是不同的32位和64位系统.它可能指向一个结构,也可能是一个位掩码。如果是这样的话,就没有定义我所能判断的结构。
现在我知道您必须使用AreDpiAwarenessContextsEqual(context1,context2)来比较两个DPI_ now _CONTEXT,您不能比较这些值。以下是我正在使用的相关Pinvoke项:
internal enum PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
}
internal enum DPI_AWARENESS {
DPI_AWARENESS_INVALID = -1,
DPI_AWARENESS_UNAWARE = 0,
DPI_AWARENESS_SYSTEM_AWARE = 1,
DPI_AWARENESS_PER_MONITOR_AWARE = 2
}
[DllImport("SHcore.dll")]
internal static extern int GetProcessDpiAwareness(IntPtr hWnd, out PROCESS_DPI_AWARENESS value);
[DllImport("user32.dll")]
internal static extern int GetDpiForWindow(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern int GetAwarenessFromDpiAwarenessContext(IntPtr dpiContext);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool AreDpiAwarenessContextsEqual(IntPtr dpiContextA,
IntPtr dpiContextB);您可以使用WinDef.h中的这些值来设置或比较:
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)但是,如果您使用这些值之一在集合之后进行获取,则不要期望得到这些值中的一个。使用AreDpiAwarenessContextsEqual。
https://stackoverflow.com/questions/49033938
复制相似问题