diff --git a/CHANGES.md b/CHANGES.md
index 6b76c354ea..5b8758a51d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -9,6 +9,7 @@ Features
--------
* Updated AIX natives and build - [@twall](https://github.com/twall).
* [#290](https://github.com/twall/jna/pull/290): Improved the stacktrace for the exceptions thrown by `com.sun.jna.Structure` - [@ebourg](https://github.com/ebourg).
+* [#332](https://github.com/twall/jna/pull/332): Added Win32 Monitor Configuration API in `com.sun.jna.platform.win32.Dxva2` - [@msteiger](https://github.com/msteiger).
* Added Winspool monitor sample and updated Kernel32, WinBase, Winspool - [@wolftobias](https://github.com/wolftobias).
* Added Some minor changes to MS Office samples Test and small changes to the MS Office samples Bug Fixes - [@wolftobias](https://github.com/wolftobias).
* [#333](https://github.com/twall/jna/pull/333): Added `CoTaskMemAlloc`, `CoTaskMemRealloc` and `CoTaskMemFree` to `com.sun.jna.platform.win32.Ole32` - [@msteiger](https://github.com/msteiger).
diff --git a/contrib/monitordemo/src/com/sun/jna/contrib/demo/MonitorInfoDemo.java b/contrib/monitordemo/src/com/sun/jna/contrib/demo/MonitorInfoDemo.java
new file mode 100644
index 0000000000..9a1e3271f7
--- /dev/null
+++ b/contrib/monitordemo/src/com/sun/jna/contrib/demo/MonitorInfoDemo.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.contrib.demo;
+
+import com.sun.jna.Memory;
+import com.sun.jna.platform.EnumUtils;
+import com.sun.jna.platform.win32.Dxva2;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_COLOR_TEMPERATURE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DISPLAY_TECHNOLOGY_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DRIVE_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_GAIN_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_POSITION_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_SIZE_TYPE;
+import com.sun.jna.platform.win32.LowLevelMonitorConfigurationAPI.MC_TIMING_REPORT;
+import com.sun.jna.platform.win32.PhysicalMonitorEnumerationAPI.PHYSICAL_MONITOR;
+import com.sun.jna.platform.win32.User32;
+import com.sun.jna.platform.win32.WTypes.LPSTR;
+import com.sun.jna.platform.win32.WinDef.DWORD;
+import com.sun.jna.platform.win32.WinDef.DWORDByReference;
+import com.sun.jna.platform.win32.WinDef.HDC;
+import com.sun.jna.platform.win32.WinDef.LPARAM;
+import com.sun.jna.platform.win32.WinDef.RECT;
+import com.sun.jna.platform.win32.WinNT.HANDLE;
+import com.sun.jna.platform.win32.WinUser;
+import com.sun.jna.platform.win32.WinUser.HMONITOR;
+import com.sun.jna.platform.win32.WinUser.MONITORENUMPROC;
+import com.sun.jna.platform.win32.WinUser.MONITORINFOEX;
+
+/**
+ * A small demo that tests the Win32 monitor API.
+ * All available physical and virtual monitors are enumerated and
+ * their capabilities printed to stdout
+ * @author Martin Steiger
+ */
+public class MonitorInfoDemo
+{
+ /**
+ * @param args (ignored)
+ */
+ public static void main(String[] args)
+ {
+ System.out.println("Installed Physical Monitors: " + User32.INSTANCE.GetSystemMetrics(WinUser.SM_CMONITORS));
+
+ User32.INSTANCE.EnumDisplayMonitors(null, null, new MONITORENUMPROC() {
+
+ @Override
+ public int apply(HMONITOR hMonitor, HDC hdc, RECT rect, LPARAM lparam)
+ {
+ enumerate(hMonitor);
+
+ return 1;
+ }
+
+ }, new LPARAM(0));
+ }
+
+ static void enumerate(HMONITOR hMonitor)
+ {
+ System.out.println("Found HMONITOR: " + hMonitor.getPointer().toString());
+
+ MONITORINFOEX info = new MONITORINFOEX();
+ User32.INSTANCE.GetMonitorInfo(hMonitor, info);
+ System.out.println("Screen " + info.rcMonitor);
+ System.out.println("Work area " + info.rcWork);
+ boolean isPrimary = (info.dwFlags & WinUser.MONITORINFOF_PRIMARY) != 0;
+ System.out.println("Primary? " + (isPrimary ? "yes" : "no"));
+ System.out.println("Device " + new String(info.szDevice));
+
+ DWORDByReference pdwNumberOfPhysicalMonitors = new DWORDByReference();
+ Dxva2.INSTANCE.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, pdwNumberOfPhysicalMonitors);
+ int monitorCount = pdwNumberOfPhysicalMonitors.getValue().intValue();
+
+ System.out.println("HMONITOR is linked to " + monitorCount + " physical monitors");
+
+ PHYSICAL_MONITOR[] physMons = new PHYSICAL_MONITOR[monitorCount];
+ Dxva2.INSTANCE.GetPhysicalMonitorsFromHMONITOR(hMonitor, monitorCount, physMons);
+
+ for (int i = 0; i < monitorCount; i++)
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+ System.out.println("Monitor " + i + " - " + new String(physMons[i].szPhysicalMonitorDescription));
+
+ enumeratePhysicalMonitor(hPhysicalMonitor);
+ }
+
+ Dxva2.INSTANCE.DestroyPhysicalMonitors(monitorCount, physMons);
+ }
+
+ /**
+ * @param hPhysicalMonitor
+ */
+ private static void enumeratePhysicalMonitor(HANDLE hPhysicalMonitor)
+ {
+ MC_DISPLAY_TECHNOLOGY_TYPE.ByReference techType = new MC_DISPLAY_TECHNOLOGY_TYPE.ByReference();
+ Dxva2.INSTANCE.GetMonitorTechnologyType(hPhysicalMonitor, techType);
+ System.out.println("TECHTYPE: " + techType.getValue());
+
+ DWORDByReference temps = new DWORDByReference();
+ DWORDByReference caps = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorCapabilities(hPhysicalMonitor, caps, temps);
+ System.out.println("CAPS " + EnumUtils.setFromInteger(caps.getValue().intValue(), HighLevelMonitorConfigurationAPI.MC_CAPS.class));
+ System.out.println("Temps " + temps.getValue());
+
+ // Brightness
+ DWORDByReference pdwMinimumBrightness = new DWORDByReference();
+ DWORDByReference pdwCurrentBrightness = new DWORDByReference();
+ DWORDByReference pdwMaximumBrightness = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorBrightness(hPhysicalMonitor, pdwMinimumBrightness, pdwCurrentBrightness, pdwMaximumBrightness);
+
+ System.out.println("Brightness Min: " + pdwMinimumBrightness.getValue());
+ System.out.println("Brightness Current: " + pdwCurrentBrightness.getValue());
+ System.out.println("Brightness Max: " + pdwMaximumBrightness.getValue());
+
+ // Contrast
+ DWORDByReference pdwMinimumContrast = new DWORDByReference();
+ DWORDByReference pdwCurrentContrast = new DWORDByReference();
+ DWORDByReference pdwMaximumContrast = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorContrast(hPhysicalMonitor, pdwMinimumContrast, pdwCurrentContrast, pdwMaximumContrast);
+
+ System.out.println("Contrast Min: " + pdwMinimumContrast.getValue());
+ System.out.println("Contrast Current: " + pdwCurrentContrast.getValue());
+ System.out.println("Contrast Max: " + pdwMaximumContrast.getValue());
+
+ // Temperature
+ MC_COLOR_TEMPERATURE.ByReference pctCurrentColorTemperature = new MC_COLOR_TEMPERATURE.ByReference();
+ Dxva2.INSTANCE.GetMonitorColorTemperature(hPhysicalMonitor, pctCurrentColorTemperature);
+ System.out.println("Current Temp: " + pctCurrentColorTemperature.getValue());
+
+ // Capabilities string
+ DWORDByReference pdwCapabilitiesStringLengthInCharacters = new DWORDByReference();
+ Dxva2.INSTANCE.GetCapabilitiesStringLength(hPhysicalMonitor, pdwCapabilitiesStringLengthInCharacters);
+ DWORD capStrLen = pdwCapabilitiesStringLengthInCharacters.getValue();
+
+ LPSTR pszASCIICapabilitiesString = new LPSTR(new Memory(capStrLen.intValue()));
+ Dxva2.INSTANCE.CapabilitiesRequestAndCapabilitiesReply(hPhysicalMonitor, pszASCIICapabilitiesString, capStrLen);
+ System.out.println("Cap-String:" + new String(pszASCIICapabilitiesString.getPointer().getString(0)));
+
+ // Position
+ MC_POSITION_TYPE ptPositionType = MC_POSITION_TYPE.MC_HORIZONTAL_POSITION;
+ DWORDByReference pdwMinimumPosition = new DWORDByReference();
+ DWORDByReference pdwCurrentPosition = new DWORDByReference();
+ DWORDByReference pdwMaximumPosition = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorDisplayAreaPosition(hPhysicalMonitor, ptPositionType, pdwMinimumPosition, pdwCurrentPosition, pdwMaximumPosition);
+
+ System.out.println("Position (horz) Min: " + pdwMinimumPosition.getValue());
+ System.out.println("Position (horz) Current: " + pdwCurrentPosition.getValue());
+ System.out.println("Position (horz) Max: " + pdwMaximumPosition.getValue());
+
+ // Size
+ MC_SIZE_TYPE ptSizeType = MC_SIZE_TYPE.MC_WIDTH;
+ DWORDByReference pdwMinimumSize = new DWORDByReference();
+ DWORDByReference pdwCurrentSize = new DWORDByReference();
+ DWORDByReference pdwMaximumSize = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorDisplayAreaSize(hPhysicalMonitor, ptSizeType, pdwMinimumSize, pdwCurrentSize, pdwMaximumSize);
+
+ System.out.println("Width Min: " + pdwMinimumSize.getValue());
+ System.out.println("Width Current: " + pdwCurrentSize.getValue());
+ System.out.println("Width Max: " + pdwMaximumSize.getValue());
+
+ // Gain
+ MC_GAIN_TYPE ptGainType = MC_GAIN_TYPE.MC_RED_GAIN;
+ DWORDByReference pdwMinimumGain = new DWORDByReference();
+ DWORDByReference pdwCurrentGain = new DWORDByReference();
+ DWORDByReference pdwMaximumGain = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorRedGreenOrBlueGain(hPhysicalMonitor, ptGainType, pdwMinimumGain, pdwCurrentGain, pdwMaximumGain);
+
+ System.out.println("Red Gain Min: " + pdwMinimumSize.getValue());
+ System.out.println("Red Gain Current: " + pdwCurrentSize.getValue());
+ System.out.println("Red Gain Max: " + pdwMaximumSize.getValue());
+
+ // Drive
+ MC_DRIVE_TYPE ptDriveType = MC_DRIVE_TYPE.MC_RED_DRIVE;
+ DWORDByReference pdwMinimumDrive = new DWORDByReference();
+ DWORDByReference pdwCurrentDrive = new DWORDByReference();
+ DWORDByReference pdwMaximumDrive = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorRedGreenOrBlueDrive(hPhysicalMonitor, ptDriveType, pdwMinimumDrive, pdwCurrentDrive, pdwMaximumDrive);
+
+ System.out.println("Red Drive Min: " + pdwMinimumSize.getValue());
+ System.out.println("Red Drive Current: " + pdwCurrentSize.getValue());
+ System.out.println("Red Drive Max: " + pdwMaximumSize.getValue());
+
+ // Timing Report
+ MC_TIMING_REPORT pmtrMonitorTimingReport = new MC_TIMING_REPORT();
+ Dxva2.INSTANCE.GetTimingReport(hPhysicalMonitor, pmtrMonitorTimingReport);
+ System.out.println("HorizontalFrequencyInHZ " + pmtrMonitorTimingReport.dwHorizontalFrequencyInHZ);
+ System.out.println("VerticalFrequencyInHZ " + pmtrMonitorTimingReport.dwVerticalFrequencyInHZ);
+
+ System.out.println("--------------------------------------");
+ }
+
+}
diff --git a/contrib/platform/src/com/sun/jna/platform/EnumConverter.java b/contrib/platform/src/com/sun/jna/platform/EnumConverter.java
new file mode 100644
index 0000000000..d27ae2cba1
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/EnumConverter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform;
+
+import com.sun.jna.FromNativeContext;
+import com.sun.jna.ToNativeContext;
+import com.sun.jna.TypeConverter;
+
+/**
+ * A {@link TypeConverter} that maps an integer enum value to
+ * an actual Java enum.
+ * @param the enum type
+ * @author Martin Steiger
+ */
+public class EnumConverter> implements TypeConverter {
+
+ private final Class clazz;
+
+ /**
+ * @param clazz the enum class
+ */
+ public EnumConverter(Class clazz)
+ {
+ this.clazz = clazz;
+ }
+
+ @Override
+ public T fromNative(Object input, FromNativeContext context) {
+ Integer i = (Integer) input;
+
+ T[] vals = clazz.getEnumConstants();
+ return vals[i];
+ }
+
+ @Override
+ public Integer toNative(Object input, ToNativeContext context) {
+ T t = clazz.cast(input);
+
+ return Integer.valueOf(t.ordinal());
+ }
+
+ @Override
+ public Class nativeType() {
+ return Integer.class;
+ }
+}
+
+
diff --git a/contrib/platform/src/com/sun/jna/platform/EnumUtils.java b/contrib/platform/src/com/sun/jna/platform/EnumUtils.java
new file mode 100644
index 0000000000..4eec551ecd
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/EnumUtils.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.sun.jna.platform.win32.FlagEnum;
+
+/**
+ * Several helper methods to convert integer flag (sets)
+ * into enum (sets)
+ * @author Martin Steiger
+ */
+public class EnumUtils
+{
+ /**
+ * Uninitialized integer flag
+ */
+ public static final int UNINITIALIZED = -1;
+
+ /**
+ * @param val the enum
+ * @return the index of the enum in the enum list
+ */
+ public static > int toInteger(E val)
+ {
+ @SuppressWarnings("unchecked")
+ E[] vals = (E[]) val.getClass().getEnumConstants();
+
+ for (int idx = 0; idx < vals.length; idx++)
+ {
+ if (vals[idx] == val)
+ return idx;
+ }
+
+ throw new IllegalArgumentException();
+ }
+
+ /**
+ * @param idx the enum index
+ * @param clazz the enum class
+ * @return the enum at position idx
+ */
+ public static > E fromInteger(int idx, Class clazz)
+ {
+ if (idx == UNINITIALIZED)
+ return null;
+
+ E[] vals = clazz.getEnumConstants();
+ return vals[idx];
+ }
+
+ /**
+ * @param flags the ORed flags
+ * @param clazz the enum class
+ * @return the representing set
+ */
+ public static Set setFromInteger(int flags, Class clazz)
+ {
+ T[] vals = clazz.getEnumConstants();
+ Set result = new HashSet();
+
+ for (T val : vals)
+ {
+ if ((flags & val.getFlag()) != 0)
+ {
+ result.add(val);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * @param set the set to convert
+ * @return the flags combined into an integer
+ */
+ public static int setToInteger(Set set) {
+ int sum = 0;
+
+ for (T t : set)
+ {
+ sum |= t.getFlag();
+ }
+
+ return sum;
+ }
+}
+
+
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/Dxva2.java b/contrib/platform/src/com/sun/jna/platform/win32/Dxva2.java
new file mode 100644
index 0000000000..462e0c4cca
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/win32/Dxva2.java
@@ -0,0 +1,508 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+import java.util.HashMap;
+
+import com.sun.jna.DefaultTypeMapper;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.platform.EnumConverter;
+import com.sun.jna.platform.win32.WTypes.LPSTR;
+import com.sun.jna.platform.win32.WinDef.BOOL;
+import com.sun.jna.platform.win32.WinDef.BYTE;
+import com.sun.jna.platform.win32.WinDef.DWORD;
+import com.sun.jna.platform.win32.WinDef.DWORDByReference;
+import com.sun.jna.platform.win32.WinNT.HANDLE;
+import com.sun.jna.platform.win32.WinUser.HMONITOR;
+import com.sun.jna.win32.StdCallLibrary;
+
+/**
+ * A port of dxva2.dll
+ * @author Martin Steiger
+ */
+public interface Dxva2 extends StdCallLibrary, PhysicalMonitorEnumerationAPI, HighLevelMonitorConfigurationAPI, LowLevelMonitorConfigurationAPI
+{
+ /**
+ * The only instance of the library
+ */
+ Dxva2 INSTANCE = (Dxva2) Native.loadLibrary("Dxva2", Dxva2.class, new HashMap()
+ {
+ private static final long serialVersionUID = -1987971664975780480L;
+
+ {
+ put(Library.OPTION_TYPE_MAPPER, new DefaultTypeMapper()
+ {
+ {
+ addTypeConverter(MC_POSITION_TYPE.class, new EnumConverter<>(MC_POSITION_TYPE.class));
+ addTypeConverter(MC_SIZE_TYPE.class, new EnumConverter<>(MC_SIZE_TYPE.class));
+ addTypeConverter(MC_GAIN_TYPE.class, new EnumConverter<>(MC_GAIN_TYPE.class));
+ addTypeConverter(MC_DRIVE_TYPE.class, new EnumConverter<>(MC_DRIVE_TYPE.class));
+ }
+ });
+ }
+ });
+
+
+ /******************************************************************************
+ Monitor capability functions
+ ******************************************************************************/
+ /**
+ * Retrieves the configuration capabilities of a monitor. Call this function to find out which high-level
+ * monitor configuration functions are supported by the monitor.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call
+ * {@link #GetPhysicalMonitorsFromHMONITOR}
+ * @param pdwMonitorCapabilities Receives a bitwise OR of capabilities flags. (MC_CAPS_*)
+ * @param pdwSupportedColorTemperatures Receives a bitwise OR of color temperature flags.
+ * (MC_SUPPORTED_COLOR_TEMPERATURE_*)
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is
+ * FALSE. To get extended error information, call GetLastError.
+ *
+ * The function fails if the monitor does not support DDC/CI.
+ */
+ BOOL GetMonitorCapabilities(HANDLE hMonitor, DWORDByReference pdwMonitorCapabilities, DWORDByReference pdwSupportedColorTemperatures);
+
+ /******************************************************************************
+ Monitor setting persistence functions
+ ******************************************************************************/
+
+ /**
+ * Saves the current monitor settings to the display's nonvolatile storage.
+ *
+ * This function takes about 200 milliseconds to return.
+ * This high-level function is identical to the low-level function SaveCurrentSettings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL SaveCurrentMonitorSettings(HANDLE hMonitor);
+
+ /******************************************************************************
+ Monitor meta-data functions
+ ******************************************************************************/
+
+ /**
+ * Retrieves the type of technology used by a monitor.
+ * This function does not support every display technology. If a monitor uses a display technology that is
+ * supported by this function, the GetMonitorCapabilities function returns the MC_CAPS_DISPLAY_TECHNOLOGY_TYPE
+ * flag. If that flag is absent, the GetMonitorTechnologyType function fails.
+ * Some monitor technologies do not support certain monitor configuration functions. For example,
+ * the DegaussMonitor function is supported only for cathode ray tube (CRT) monitors. To find out whether a
+ * specific function is supported, call GetMonitorCapabilities.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param pdtyDisplayTechnologyType Receives the technology type as defined in {@link HighLevelMonitorConfigurationAPI.MC_DISPLAY_TECHNOLOGY_TYPE}.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetMonitorTechnologyType(HANDLE hMonitor, MC_DISPLAY_TECHNOLOGY_TYPE.ByReference pdtyDisplayTechnologyType);
+
+ /******************************************************************************
+ Monitor image calibration functions
+ ******************************************************************************/
+
+ /**
+ * Retrieves a monitor's minimum, maximum, and current brightness settings.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_BRIGHTNESS flag.
+ * This function takes about 40 milliseconds to return. The brightness setting is a continuous monitor setting.
+ * @param hMonitor Handle to a physical monitor
+ * @param pdwMinimumBrightness Receives the monitor's minimum brightness.
+ * @param pdwCurrentBrightness Receives the monitor's current brightness.
+ * @param pdwMaximumBrightness Receives the monitor's maximum brightness.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetMonitorBrightness(HANDLE hMonitor, DWORDByReference pdwMinimumBrightness,
+ DWORDByReference pdwCurrentBrightness, DWORDByReference pdwMaximumBrightness);
+
+ /**
+ * Retrieves a monitor's minimum, maximum, and current contrast settings.
+ * @param hMonitor Handle to a physical monitor.
+ * @param pdwMinimumContrast Receives the monitor's minimum contrast.
+ * @param pdwCurrentContrast Receives the monitor's current contrast.
+ * @param pdwMaximumContrast Receives the monitor's maximum contrast.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetMonitorContrast(HANDLE hMonitor, DWORDByReference pdwMinimumContrast, DWORDByReference pdwCurrentContrast,
+ DWORDByReference pdwMaximumContrast);
+
+ /**
+ * Retrieves a monitor's current color temperature.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_COLOR_TEMPERATURE flag.
+ * This function takes between 0 and 80 milliseconds to return.
+ * @param hMonitor Handle to a physical monitor.
+ * @param pctCurrentColorTemperature Receives the monitor's current color temperature.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetMonitorColorTemperature(HANDLE hMonitor, MC_COLOR_TEMPERATURE.ByReference pctCurrentColorTemperature);
+
+ /**
+ * Retrieves a monitor's red, green, or blue drive value.
+ *
+ * Drive settings are generally used to adjust the monitor's white point. Drive and black level are different
+ * names for the same monitor setting. If this function is supported, the GetMonitorCapabilities function returns
+ * the MC_CAPS_RED_GREEN_BLUE_DRIVE flag.
+ * @param hMonitor Handle to a physical monitor.
+ * @param dtDriveType A member of the MC_DRIVE_TYPE enumeration, specifying whether to retrieve the red, green, or blue drive value.
+ * @param pdwMinimumDrive Receives the minimum red, green, or blue drive value.
+ * @param pdwCurrentDrive Receives the current red, green, or blue drive value.
+ * @param pdwMaximumDrive Receives the maximum red, green, or blue drive value.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetMonitorRedGreenOrBlueDrive(HANDLE hMonitor, MC_DRIVE_TYPE dtDriveType, DWORDByReference pdwMinimumDrive,
+ DWORDByReference pdwCurrentDrive, DWORDByReference pdwMaximumDrive);
+
+ /**
+ * Retrieves a monitor's red, green, or blue gain value.
+ *
+ * Gain settings are generally used to adjust the monitor's white point. If this function is supported, the
+ * GetMonitorCapabilities function returns the MC_CAPS_RED_GREEN_BLUE_GAIN flag. This function takes about 40 milliseconds to return.
+ * The gain settings are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor.
+ * @param gtGainType A member of the MC_GAIN_TYPE enumeration, specifying whether to retrieve the red, green, or blue gain value.
+ * @param pdwMinimumGain Receives the minimum red, green, or blue gain value.
+ * @param pdwCurrentGain Receives the current red, green, or blue gain value.
+ * @param pdwMaximumGain Receives the maximum red, green, or blue gain value.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetMonitorRedGreenOrBlueGain(HANDLE hMonitor, MC_GAIN_TYPE gtGainType, DWORDByReference pdwMinimumGain,
+ DWORDByReference pdwCurrentGain, DWORDByReference pdwMaximumGain);
+
+ /**
+ * Sets a monitor's brightness value.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_BRIGHTNESS flag.
+ * This function takes about 50 milliseconds to return.
+ * The brightness setting is a continuous monitor setting.
+ * @param hMonitor Handle to a physical monitor.
+ * @param dwNewBrightness Brightness value. To get the monitor's minimum and maximum brightness values, call GetMonitorBrightness.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL SetMonitorBrightness(HANDLE hMonitor, int dwNewBrightness);
+
+ /**
+ * Sets a monitor's contrast value.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_CONTRAST flag.
+ * This function takes about 50 milliseconds to return. The brightness setting is a continuous monitor setting.
+ * @param hMonitor Handle to a physical monitor.
+ * @param dwNewContrast Contrast value. To get the monitor's minimum and maximum contrast values, call GetMonitorContrast.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL SetMonitorContrast(HANDLE hMonitor, int dwNewContrast);
+
+ /**
+ * Sets a monitor's color temperature.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_COLOR_TEMPERATURE flag.
+ * The GetMonitorCapabilities function also returns the range of color temperatures that the monitor supports.
+ * The ctCurrentColorTemperature parameter must correspond to one of these values. Changing the color temperature
+ * changes the monitor's white point. It can also change the current drive and gain settings. To get the new drive
+ * and gain settings, call GetMonitorRedGreenOrBlueDrive and GetMonitorRedGreenOrBlueGain, respectively.
+ * This function takes from 50 to 90 milliseconds to return.
+ * @param hMonitor Handle to a physical monitor.
+ * @param ctCurrentColorTemperature Color temperature, specified as a member of the MC_COLOR_TEMPERATURE enumeration.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL SetMonitorColorTemperature(HANDLE hMonitor, MC_COLOR_TEMPERATURE ctCurrentColorTemperature);
+
+ /**
+ * Sets a monitor's red, green, or blue drive value.
+ *
+ * Drive settings are generally used to adjust the
+ * monitor's white point. Drive and black level are different names for the same monitor setting. If this function
+ * is supported, the GetMonitorCapabilities function returns the MC_CAPS_RED_GREEN_BLUE_DRIVE flag. This function
+ * takes about 50 milliseconds to return. Changing the drive settings can change the color temperature. To get the
+ * new color temperature, call GetMonitorColorTemperature. The drive settings are continuous monitor settings
+ * @param hMonitor Handle to a physical monitor.
+ * @param dtDriveType A member of the MC_DRIVE_TYPE enumeration, specifying whether to set the red, green, or blue
+ * drive value.
+ * @param dwNewDrive Red, green, or blue drive value. To get the monitor's minimum and maximum drive values, call
+ * GetMonitorRedGreenOrBlueDrive.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL SetMonitorRedGreenOrBlueDrive(HANDLE hMonitor, MC_DRIVE_TYPE dtDriveType, int dwNewDrive);
+
+ /**
+ * Sets a monitor's red, green, or blue gain value.
+ *
+ * Gain settings are generally used to adjust the
+ * monitor's white point. If this function is supported, the GetMonitorCapabilities function returns the
+ * MC_CAPS_RED_GREEN_BLUE_GAIN flag. This function takes about 50 milliseconds to return. Changing the gain settings
+ * can change the color temperature. To get the new color temperature, call GetMonitorColorTemperature. The gain
+ * settings are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor.
+ * @param gtGainType A member of the MC_GAIN_TYPE enumeration, specifying whether to set the red, green, or blue
+ * gain.
+ * @param dwNewGain Red, green, or blue gain value. To get the monitor's minimum and maximum gain values, call
+ * GetMonitorRedGreenOrBlueGain.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL SetMonitorRedGreenOrBlueGain(HANDLE hMonitor, MC_GAIN_TYPE gtGainType, int dwNewGain);
+
+ /**
+ * Degausses a monitor.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_DEGAUSS flag. Degaussing
+ * is supported only by cathode ray tube (CRT) monitors. This function takes about 50 milliseconds to return. This
+ * function should not be called frequently, because calling it frequently will not noticeably improve the monitor's
+ * image quality or color fidelity.
+ * @param hMonitor Handle to a physical monitor.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL DegaussMonitor(HANDLE hMonitor);
+
+ /******************************************************************************
+ * Monitor image size and position calibration functions
+ ******************************************************************************/
+
+ /**
+ * Retrieves a monitor's minimum, maximum, and current width or height.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_DISPLAY_AREA_SIZE flag.
+ * This function takes about 40 milliseconds to return. The width and height settings are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param stSizeType A member of the MC_SIZE_TYPE enumeration, specifying whether to retrieve the width or the height.
+ * @param pdwMinimumWidthOrHeight Receives the minimum width or height.
+ * @param pdwCurrentWidthOrHeight Receives the current width or height.
+ * @param pdwMaximumWidthOrHeight Receives the maximum width or height.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetMonitorDisplayAreaSize(HANDLE hMonitor, MC_SIZE_TYPE stSizeType, DWORDByReference pdwMinimumWidthOrHeight,
+ DWORDByReference pdwCurrentWidthOrHeight, DWORDByReference pdwMaximumWidthOrHeight);
+
+ /**
+ * Retrieves a monitor's minimum, maximum, and current horizontal or vertical position.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_DISPLAY_AREA_POSITION flag.
+ * This function takes about 40 milliseconds to return. The horizontal and vertical position are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param ptPositionType A member of the MC_POSITION_TYPE enumeration, specifying whether to retrieve the horizontal position or the vertical position.
+ * @param pdwMinimumPosition Receives the minimum horizontal or vertical position.
+ * @param pdwCurrentPosition Receives the current horizontal or vertical position.
+ * @param pdwMaximumPosition Receives the maximum horizontal or vertical position.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetMonitorDisplayAreaPosition(HANDLE hMonitor, MC_POSITION_TYPE ptPositionType,
+ DWORDByReference pdwMinimumPosition, DWORDByReference pdwCurrentPosition,
+ DWORDByReference pdwMaximumPosition);
+
+ /**
+ * Sets the width or height of a monitor's display area.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_DISPLAY_AREA_SIZE flag.
+ * This function takes about 50 milliseconds to return. The width and height settings are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param stSizeType A member of the MC_SIZE_TYPE enumeration, specifying whether to set the width or the height.
+ * @param dwNewDisplayAreaWidthOrHeight Display area width or height. To get the minimum and maximum width and height,
+ * call GetMonitorDisplayAreaSize.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL SetMonitorDisplayAreaSize(HANDLE hMonitor, MC_SIZE_TYPE stSizeType, int dwNewDisplayAreaWidthOrHeight);
+
+ /**
+ * Sets the horizontal or vertical position of a monitor's display area.
+ *
+ * If this function is supported, the GetMonitorCapabilities function returns the MC_CAPS_DISPLAY_AREA_POSITION flag.
+ * This function takes about 50 milliseconds to return. The horizontal and vertical position are continuous monitor settings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param ptPositionType A member of the MC_POSITION_TYPE enumeration, specifying whether to set the horizontal position or the vertical position.
+ * @param dwNewPosition Horizontal or vertical position. To get the minimum and maximum position, call GetMonitorDisplayAreaPosition.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL SetMonitorDisplayAreaPosition(HANDLE hMonitor, MC_POSITION_TYPE ptPositionType, int dwNewPosition);
+
+ /******************************************************************************
+ * Restore to defaults functions
+ ******************************************************************************/
+
+ /**
+ * Restores a monitor's color settings to their factory defaults. This function potentially changes the current
+ * value of the monitor's brightness, contrast, color temperature, drive, and gain. The current value of each
+ * setting is changed to its factory default. The default settings depend on the manufacturer. This function can
+ * also change the range of supported values for each of these settings. The function does not enable any monitor
+ * settings that were disabled. If this function is supported, the GetMonitorCapabilities function returns the
+ * MC_CAPS_RESTORE_FACTORY_COLOR_DEFAULTS flag. This function takes about 5 seconds to return. This function might
+ * reset monitor settings that are not accessible through the high-level monitor configuration functions. Whether
+ * this occurs depends on the specific model of monitor. The following settings are not affected by this function:
+ * Display area size
+ * Display area position
+ * Capabilities flags
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL RestoreMonitorFactoryColorDefaults(HANDLE hMonitor);
+
+ /**
+ * Restores a monitor's settings to their factory defaults. This function restores all of the settings that are
+ * supported by the high-level monitor configuration functions. It might also restore settings that are available
+ * only through the low-level functions and are not supported by the high-level functions. The current value of each
+ * setting is changed to its factory default. The exact settings that change, and the default values of those
+ * settings, depend on the manufacturer. This function can also change the range of supported values for some
+ * settings. If this function is supported, the GetMonitorCapabilities function returns the
+ * MC_CAPS_RESTORE_FACTORY_DEFAULTS flag. This function takes about 5 seconds to return. If GetMonitorCapabilities
+ * returns the MC_RESTORE_FACTORY_DEFAULTS_ENABLES_MONITOR_SETTINGS flag, this function also enables all of the
+ * monitor settings that are supported by the high-level functions. It is sometimes possible for an application to
+ * disable certain settings by calling the low-level functions. It is also possible for the user to disable certain
+ * settings by adjusting settings on the monitor's physical control panel. If that happens, the setting can only be
+ * re-enabled through the control panel or by calling RestoreMonitorFactoryDefaults. It is not possible to disable
+ * any settings by using the high-level functions.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL RestoreMonitorFactoryDefaults(HANDLE hMonitor);
+
+ // LowLevelMonitorConfigurationAPI.h
+
+ /**
+ * Retrieves the current value, maximum value, and code type of a Virtual Control Panel (VCP) code for a monitor.
+ * This function corresponds to the "Get VCP Feature & VCP Feature Reply" command from the Display Data
+ * Channel Command Interface (DDC/CI) standard. Vendor-specific VCP codes can be used with this function.
+ * This function takes about 40 milliseconds to return.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param bVCPCode VCP code to query. The VCP codes are Include the VESA Monitor Control Command Set (MCCS)
+ * standard, versions 1.0 and 2.0. This parameter must specify a continuous or non-continuous VCP, or a
+ * vendor-specific code. It should not be a table control code.
+ * @param pvct Receives the VCP code type, as a member of the MC_VCP_CODE_TYPE enumeration. This parameter can be NULL.
+ * @param pdwCurrentValue Receives the current value of the VCP code. This parameter can be NULL.
+ * @param pdwMaximumValue If bVCPCode specifies a continuous VCP code, this parameter receives the maximum value of
+ * the VCP code. If bVCPCode specifies a non-continuous VCP code, the value received in this parameter
+ * is undefined. This parameter can be NULL.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetVCPFeatureAndVCPFeatureReply(HANDLE hMonitor, BYTE bVCPCode, MC_VCP_CODE_TYPE.ByReference pvct,
+ DWORDByReference pdwCurrentValue, DWORDByReference pdwMaximumValue);
+
+ /**
+ * Sets the value of a Virtual Control Panel (VCP) code for a monitor. This function corresponds to the
+ * "Set VCP Feature" command from the Display Data Channel Command Interface (DDC/CI) standard. This function takes
+ * about 50 milliseconds to return.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param bVCPCode VCP code to set. The VCP codes are defined in the VESA Monitor Control Command Set (MCCS)
+ * standard, version 1.0 and 2.0. This parameter must specify a continuous or non-continuous VCP, or a
+ * vendor-specific code. It should not be a table control code.
+ * @param dwNewValue Value of the VCP code.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL SetVCPFeature(HANDLE hMonitor, BYTE bVCPCode, DWORD dwNewValue);
+
+ /**
+ * Saves the current monitor settings to the display's nonvolatile storage. This function corresponds to the
+ * "Save Current Settings" function from the Display Data Channel Command Interface (DDC/CI) standard. This function
+ * takes about 200 milliseconds to return. This low-level function is identical to the high-level function
+ * SaveCurrentMonitorSettings.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL SaveCurrentSettings(HANDLE hMonitor);
+
+ /**
+ * Retrieves the length of a monitor's capabilities string.
+ * This function usually returns quickly, but sometimes it can take several seconds to complete.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param pdwCapabilitiesStringLengthInCharacters Receives the length of the capabilities string, in characters, including the terminating null character.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetCapabilitiesStringLength(HANDLE hMonitor, DWORDByReference pdwCapabilitiesStringLengthInCharacters);
+
+ /**
+ * Retrieves a string describing a monitor's capabilities. This function corresponds to the
+ * "Capabilities Request & Capabilities Reply" command from the Display Data Channel Command Interface (DDC/CI)
+ * standard. For more information about the capabilities string, refer to the DDC/CI standard. This function usually
+ * returns quickly, but sometimes it can take several seconds to complete. You can update a monitor's capabilities
+ * string by adding an AddReg directive to the monitor's INF file. Add a registry key named "CapabilitiesString" to
+ * the monitor's driver key. The value of the registry key is the capabilities string. The registry data type is
+ * REG_SZ.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param pszASCIICapabilitiesString Pointer to a buffer that receives the monitor's capabilities string. The caller
+ * must allocate this buffer. To get the size of the string, call GetCapabilitiesStringLength. The capabilities
+ * string is always an ASCII string. The buffer must include space for the terminating null character.
+ * @param dwCapabilitiesStringLengthInCharacters Size of pszASCIICapabilitiesString in characters, including the
+ * terminating null character.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL CapabilitiesRequestAndCapabilitiesReply(HANDLE hMonitor, LPSTR pszASCIICapabilitiesString,
+ DWORD dwCapabilitiesStringLengthInCharacters);
+
+ /**
+ * Retrieves a monitor's horizontal and vertical synchronization frequencies.
+ * @param hMonitor Handle to a physical monitor. To get the monitor handle, call GetPhysicalMonitorsFromHMONITOR
+ * @param pmtrMonitorTimingReport Pointer to an MC_TIMING_REPORT structure that receives the timing information.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ */
+ BOOL GetTimingReport(HANDLE hMonitor, MC_TIMING_REPORT pmtrMonitorTimingReport);
+
+ // PhysicalMonitorEnumerationAPI.h
+
+ /******************************************************************************
+ * Physical Monitor Enumeration Functions
+ ******************************************************************************/
+
+ /**
+ * Retrieves the number of physical monitors associated with an HMONITOR monitor handle. Call this function before
+ * calling GetPhysicalMonitorsFromHMONITOR.
+ * @param hMonitor A monitor handle. Monitor handles are returned by several Multiple Display Monitor functions,
+ * including EnumDisplayMonitors and MonitorFromWindow, which are part of the graphics device interface (GDI).
+ * @param pdwNumberOfPhysicalMonitors Receives the number of physical monitors associated with the monitor handle.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetNumberOfPhysicalMonitorsFromHMONITOR(HMONITOR hMonitor, DWORDByReference pdwNumberOfPhysicalMonitors);
+
+ // HRESULT GetNumberOfPhysicalMonitorsFromIDirect3DDevice9
+ // (
+ // IDirect3DDevice9* pDirect3DDevice9,
+ // DWORDByReference pdwNumberOfPhysicalMonitors
+ // );
+
+ /**
+ * Retrieves the physical monitors associated with an HMONITOR monitor handle. A single HMONITOR handle can be
+ * associated with more than one physical monitor. This function returns a handle and a text description for each
+ * physical monitor. When you are done using the monitor handles, close them by passing the pPhysicalMonitorArray
+ * array to the DestroyPhysicalMonitors function.
+ * @param hMonitor A monitor handle. Monitor handles are returned by several Multiple Display Monitor functions,
+ * including EnumDisplayMonitors and MonitorFromWindow, which are part of the graphics device interface (GDI).
+ * @param dwPhysicalMonitorArraySize Number of elements in pPhysicalMonitorArray. To get the required size of the
+ * array, call GetNumberOfPhysicalMonitorsFromHMONITOR.
+ * @param pPhysicalMonitorArray Pointer to an array of PHYSICAL_MONITOR structures. The caller must allocate the
+ * array.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL GetPhysicalMonitorsFromHMONITOR(HMONITOR hMonitor, int dwPhysicalMonitorArraySize,
+ PHYSICAL_MONITOR[] pPhysicalMonitorArray);
+
+ // HRESULT GetPhysicalMonitorsFromIDirect3DDevice9
+ // (
+ // __in IDirect3DDevice9* pDirect3DDevice9,
+ // __in DWORD dwPhysicalMonitorArraySize,
+ // __out_ecount(dwPhysicalMonitorArraySize) LPPHYSICAL_MONITOR pPhysicalMonitorArray
+ // );
+
+ /**
+ * Closes a handle to a physical monitor.
+ * Call this function to close a monitor handle obtained from the GetPhysicalMonitorsFromHMONITOR
+ * @param hMonitor Handle to a physical monitor.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL DestroyPhysicalMonitor(HANDLE hMonitor);
+
+ /**
+ * Closes an array of physical monitor handles.
+ * Call this function to close an array of monitor handles obtained from the GetPhysicalMonitorsFromHMONITOR
+ * @param dwPhysicalMonitorArraySize Number of elements in the pPhysicalMonitorArray array.
+ * @param pPhysicalMonitorArray Pointer to an array of PHYSICAL_MONITOR structures.
+ * @return If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE
+ */
+ BOOL DestroyPhysicalMonitors(int dwPhysicalMonitorArraySize, PHYSICAL_MONITOR[] pPhysicalMonitorArray);
+}
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/FlagEnum.java b/contrib/platform/src/com/sun/jna/platform/win32/FlagEnum.java
new file mode 100644
index 0000000000..f650c1f384
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/win32/FlagEnum.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+/**
+ * An interface for enum that can be combined to a
+ * set based on an integer value
+ * @author Martin Steiger
+ */
+public interface FlagEnum
+{
+ /**
+ * @return the flag value - usually 2^n
+ */
+ int getFlag();
+}
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/HighLevelMonitorConfigurationAPI.java b/contrib/platform/src/com/sun/jna/platform/win32/HighLevelMonitorConfigurationAPI.java
new file mode 100644
index 0000000000..2519260b82
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/win32/HighLevelMonitorConfigurationAPI.java
@@ -0,0 +1,436 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+import com.sun.jna.platform.EnumUtils;
+
+/**
+ * A conversion of HighLevelMonitorConfigurationAPI.h
+ * @author Martin Steiger
+ */
+public interface HighLevelMonitorConfigurationAPI
+{
+ /**
+ * Monitor capabilities - retrieved by GetMonitorCapabilities
+ */
+ enum MC_CAPS implements FlagEnum
+ {
+ /**
+ * The monitor does not support any monitor settings.
+ */
+ MC_CAPS_NONE (0x00000000),
+
+ /**
+ * The monitor supports the GetMonitorTechnologyType function.
+ */
+ MC_CAPS_MONITOR_TECHNOLOGY_TYPE (0x00000001),
+
+ /**
+ * The monitor supports the GetMonitorBrightness and SetMonitorBrightness functions.
+ */
+ MC_CAPS_BRIGHTNESS (0x00000002),
+
+ /**
+ * The monitor supports the GetMonitorContrast and SetMonitorContrast functions.
+ */
+ MC_CAPS_CONTRAST (0x00000004),
+
+ /**
+ * The monitor supports the GetMonitorColorTemperature and SetMonitorColorTemperature functions.
+ */
+ MC_CAPS_COLOR_TEMPERATURE (0x00000008),
+
+ /**
+ * The monitor supports the GetMonitorRedGreenOrBlueGain and SetMonitorRedGreenOrBlueGain functions.
+ */
+ MC_CAPS_RED_GREEN_BLUE_GAIN (0x00000010),
+
+ /**
+ * The monitor supports the GetMonitorRedGreenOrBlueDrive and SetMonitorRedGreenOrBlueDrive functions.
+ */
+ MC_CAPS_RED_GREEN_BLUE_DRIVE (0x00000020),
+
+ /**
+ * The monitor supports the DegaussMonitor function.
+ */
+ MC_CAPS_DEGAUSS (0x00000040),
+
+ /**
+ * The monitor supports the GetMonitorDisplayAreaPosition and SetMonitorDisplayAreaPosition functions.
+ */
+ MC_CAPS_DISPLAY_AREA_POSITION (0x00000080),
+
+ /**
+ * The monitor supports the GetMonitorDisplayAreaSize and SetMonitorDisplayAreaSize functions.
+ */
+ MC_CAPS_DISPLAY_AREA_SIZE (0x00000100),
+
+ /**
+ * The monitor supports the RestoreMonitorFactoryDefaults function.
+ */
+ MC_CAPS_RESTORE_FACTORY_DEFAULTS (0x00000400),
+
+ /**
+ * The monitor supports the RestoreMonitorFactoryColorDefaults function.
+ */
+ MC_CAPS_RESTORE_FACTORY_COLOR_DEFAULTS (0x00000800),
+
+ /**
+ * If this flag is present, calling the RestoreMonitorFactoryDefaults function enables all of
+ * the monitor settings used by the high-level monitor configuration functions. For more
+ * information, see the Remarks section in RestoreMonitorFactoryDefaults.
+ */
+ MC_RESTORE_FACTORY_DEFAULTS_ENABLES_MONITOR_SETTINGS (0x00001000);
+
+ private int flag;
+
+ MC_CAPS(int flag)
+ {
+ this.flag = flag;
+ }
+
+ @Override
+ public int getFlag()
+ {
+ return flag;
+ }
+ }
+
+ /**
+ * Monitor capabilities - retrieved by GetMonitorCapabilities
+ */
+ enum MC_SUPPORTED_COLOR_TEMPERATURE implements FlagEnum
+ {
+ /**
+ * No color temperatures are supported.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_NONE (0x00000000),
+
+ /**
+ * The monitor supports 4,000 kelvins (K) color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_4000K (0x00000001),
+
+ /**
+ * The monitor supports 5,000 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_5000K (0x00000002),
+
+ /**
+ * The monitor supports 6,500 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_6500K (0x00000004),
+
+ /**
+ * The monitor supports 7,500 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_7500K (0x00000008),
+
+ /**
+ * The monitor supports 8,200 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_8200K (0x00000010),
+
+ /**
+ * The monitor supports 9,300 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_9300K (0x00000020),
+
+ /**
+ * The monitor supports 10,000 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_10000K (0x00000040),
+
+ /**
+ * The monitor supports 11,500 K color temperature.
+ */
+ MC_SUPPORTED_COLOR_TEMPERATURE_11500K (0x00000080);
+
+ private int flag;
+
+ MC_SUPPORTED_COLOR_TEMPERATURE(int flag)
+ {
+ this.flag = flag;
+ }
+
+ @Override
+ public int getFlag()
+ {
+ return flag;
+ }
+ }
+
+ // ******************************************************************************
+ // Enumerations
+ // ******************************************************************************
+
+ /**
+ * Identifies monitor display technologies.
+ */
+ public enum MC_DISPLAY_TECHNOLOGY_TYPE
+ {
+ /**
+ * Shadow-mask cathode ray tube (CRT).
+ */
+ MC_SHADOW_MASK_CATHODE_RAY_TUBE,
+
+ /**
+ * Aperture-grill CRT.
+ */
+ MC_APERTURE_GRILL_CATHODE_RAY_TUBE,
+
+ /**
+ * Thin-film transistor (TFT) display.
+ */
+ MC_THIN_FILM_TRANSISTOR,
+
+ /**
+ * Liquid crystal on silicon (LCOS) display.
+ */
+ MC_LIQUID_CRYSTAL_ON_SILICON,
+
+ /**
+ * Plasma display.
+ */
+ MC_PLASMA,
+
+ /**
+ * Organic light emitting diode (LED) display.
+ */
+ MC_ORGANIC_LIGHT_EMITTING_DIODE,
+
+ /**
+ * Electroluminescent display.
+ */
+ MC_ELECTROLUMINESCENT,
+
+ /**
+ * Microelectromechanical display.
+ */
+ MC_MICROELECTROMECHANICAL,
+
+ /**
+ * Field emission device (FED) display.
+ */
+ MC_FIELD_EMISSION_DEVICE;
+
+ /**
+ * Defines a Reference to the enum
+ */
+ public static class ByReference extends com.sun.jna.ptr.ByReference {
+
+ /**
+ * Create an uninitialized reference
+ */
+ public ByReference() {
+ super(4);
+ getPointer().setInt(0, EnumUtils.UNINITIALIZED);
+ }
+
+ /**
+ * Instantiates a new reference.
+ * @param value the value
+ */
+ public ByReference(MC_DISPLAY_TECHNOLOGY_TYPE value) {
+ super(4);
+ setValue(value);
+ }
+
+ /**
+ * Sets the value.
+ * @param value the new value
+ */
+ public void setValue(MC_DISPLAY_TECHNOLOGY_TYPE value) {
+ getPointer().setInt(0, EnumUtils.toInteger(value));
+ }
+
+ /**
+ * Gets the value.
+ * @return the value
+ */
+ public MC_DISPLAY_TECHNOLOGY_TYPE getValue() {
+ return EnumUtils.fromInteger(getPointer().getInt(0), MC_DISPLAY_TECHNOLOGY_TYPE.class);
+ }
+ }
+ }
+
+ /**
+ * Specifies whether to set or get a monitor's red, green, or blue drive.
+ */
+ public enum MC_DRIVE_TYPE
+ {
+ /**
+ * Red drive
+ */
+ MC_RED_DRIVE,
+
+ /**
+ * Green drive
+ */
+ MC_GREEN_DRIVE,
+
+ /**
+ * Blue drive
+ */
+ MC_BLUE_DRIVE
+ }
+
+ /**
+ * Specifies whether to get or set a monitor's red, green, or blue gain.
+ */
+ public enum MC_GAIN_TYPE
+ {
+ /**
+ * Red gain
+ */
+ MC_RED_GAIN,
+
+ /**
+ * Green gain
+ */
+ MC_GREEN_GAIN,
+
+ /**
+ * Blue gain
+ */
+ MC_BLUE_GAIN
+ }
+
+ /**
+ * Specifies whether to get or set the vertical or horizontal position of a monitor's display area.
+ */
+ public enum MC_POSITION_TYPE
+ {
+ /**
+ * Horizontal position
+ */
+ MC_HORIZONTAL_POSITION,
+
+ /**
+ * Vertical position
+ */
+ MC_VERTICAL_POSITION
+
+ }
+
+ /**
+ * Specifies whether to get or set the width or height of a monitor's display area.
+ */
+ public enum MC_SIZE_TYPE
+ {
+ /**
+ * Width
+ */
+ MC_WIDTH,
+
+ /**
+ * Height
+ */
+ MC_HEIGHT
+
+ }
+
+ /**
+ * Describes a monitor's color temperature.
+ */
+ public enum MC_COLOR_TEMPERATURE
+ {
+ /**
+ * Unknown temperature.
+ */
+ MC_COLOR_TEMPERATURE_UNKNOWN,
+
+ /**
+ * 4,000 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_4000K,
+
+ /**
+ * 5,000 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_5000K,
+
+ /**
+ * 6,500 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_6500K,
+
+ /**
+ * 7,500 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_7500K,
+
+ /**
+ * 8,200 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_8200K,
+
+ /**
+ * 9,300 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_9300K,
+
+ /**
+ * 10,000 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_10000K,
+
+ /**
+ * 11,500 kelvins (K).
+ */
+ MC_COLOR_TEMPERATURE_11500K;
+
+ /**
+ * Defines a Reference to the enum
+ */
+ public static class ByReference extends com.sun.jna.ptr.ByReference {
+
+ /**
+ * Create an uninitialized reference
+ */
+ public ByReference() {
+ super(4);
+ getPointer().setInt(0, EnumUtils.UNINITIALIZED);
+ }
+
+ /**
+ * Instantiates a new reference.
+ * @param value the value
+ */
+ public ByReference(MC_COLOR_TEMPERATURE value) {
+ super(4);
+ setValue(value);
+ }
+
+ /**
+ * Sets the value.
+ * @param value the new value
+ */
+ public void setValue(MC_COLOR_TEMPERATURE value) {
+ getPointer().setInt(0, EnumUtils.toInteger(value));
+ }
+
+ /**
+ * Gets the value.
+ * @return the value
+ */
+ public MC_COLOR_TEMPERATURE getValue() {
+ return EnumUtils.fromInteger(getPointer().getInt(0), MC_COLOR_TEMPERATURE.class);
+ }
+ }
+ }
+}
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/LowLevelMonitorConfigurationAPI.java b/contrib/platform/src/com/sun/jna/platform/win32/LowLevelMonitorConfigurationAPI.java
new file mode 100644
index 0000000000..2882e09d0f
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/win32/LowLevelMonitorConfigurationAPI.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.jna.Structure;
+import com.sun.jna.platform.EnumUtils;
+import com.sun.jna.platform.win32.WinDef.BYTE;
+import com.sun.jna.platform.win32.WinDef.DWORD;
+
+/**
+ * Conversion of LowLevelMonitorConfigurationAPI.h
+ * @author Martin Steiger
+ */
+public interface LowLevelMonitorConfigurationAPI
+{
+ /**
+ * Contains information from a monitor's timing report.
+ */
+ class MC_TIMING_REPORT extends Structure
+ {
+ /**
+ * The monitor's horizontal synchronization frequency in Hz.
+ */
+ public DWORD dwHorizontalFrequencyInHZ;
+
+ /**
+ * The monitor's vertical synchronization frequency in Hz.
+ */
+ public DWORD dwVerticalFrequencyInHZ;
+
+ /**
+ * Timing status byte. For more information about this value, see the Display Data Channel Command
+ * Interface (DDC/CI) standard.
+ */
+ public BYTE bTimingStatusByte;
+
+ @Override
+ protected List getFieldOrder()
+ {
+ return Arrays.asList("dwHorizontalFrequencyInHZ", "dwVerticalFrequencyInHZ", "bTimingStatusByte");
+ }
+ }
+
+ /**
+ * Describes a Virtual Control Panel (VCP) code type.
+ */
+ enum MC_VCP_CODE_TYPE
+ {
+ /**
+ * Momentary VCP code. Sending a command of this type causes the monitor to initiate a self-timed
+ * operation and then revert to its original state. Examples include display tests and degaussing.
+ */
+ MC_MOMENTARY,
+
+ /**
+ * Set Parameter VCP code. Sending a command of this type changes some aspect of the monitor's operation.
+ */
+ MC_SET_PARAMETER;
+
+ /**
+ * Defines a Reference to the enum
+ */
+ public static class ByReference extends com.sun.jna.ptr.ByReference {
+
+ /**
+ * Create an uninitialized reference
+ */
+ public ByReference() {
+ super(4);
+ }
+
+ /**
+ * Instantiates a new reference.
+ * @param value the value
+ */
+ public ByReference(MC_VCP_CODE_TYPE value) {
+ super(4);
+ setValue(value);
+ }
+
+ /**
+ * Sets the value.
+ * @param value the new value
+ */
+ public void setValue(MC_VCP_CODE_TYPE value) {
+ getPointer().setInt(0, EnumUtils.toInteger(value));
+ }
+
+ /**
+ * Gets the value.
+ * @return the value
+ */
+ public MC_VCP_CODE_TYPE getValue() {
+ return EnumUtils.fromInteger(getPointer().getInt(0), MC_VCP_CODE_TYPE.class);
+ }
+ }
+ }
+}
+
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/PhysicalMonitorEnumerationAPI.java b/contrib/platform/src/com/sun/jna/platform/win32/PhysicalMonitorEnumerationAPI.java
new file mode 100644
index 0000000000..bd129357d9
--- /dev/null
+++ b/contrib/platform/src/com/sun/jna/platform/win32/PhysicalMonitorEnumerationAPI.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.jna.Structure;
+import com.sun.jna.platform.win32.WinNT.HANDLE;
+
+/**
+ * Conversion of PhysicalMonitorEnumerationAPI.h
+ * @author Martin Steiger
+ */
+public interface PhysicalMonitorEnumerationAPI
+{
+
+ /******************************************************************************
+ Physical Monitor Constants
+ ******************************************************************************/
+
+ /**
+ * A physical monitor description is always an array of 128 characters. Some
+ * of the characters may not be used.
+ */
+ final int PHYSICAL_MONITOR_DESCRIPTION_SIZE = 128;
+
+ /******************************************************************************
+ Physical Monitor Structures
+ ******************************************************************************/
+
+ /**
+ * Contains a handle and text description corresponding to a physical monitor.
+ */
+ public class PHYSICAL_MONITOR extends Structure
+ {
+ /**
+ * Handle to the physical monitor.
+ */
+ public HANDLE hPhysicalMonitor;
+
+ /**
+ * Text description of the physical monitor (always 128 chars)
+ */
+ public char[] szPhysicalMonitorDescription = new char[PHYSICAL_MONITOR_DESCRIPTION_SIZE];
+
+ @Override
+ protected List getFieldOrder()
+ {
+ return Arrays.asList("hPhysicalMonitor", "szPhysicalMonitorDescription");
+ }
+ }
+}
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/User32.java b/contrib/platform/src/com/sun/jna/platform/win32/User32.java
index 5c559634cd..4c3ce26af9 100644
--- a/contrib/platform/src/com/sun/jna/platform/win32/User32.java
+++ b/contrib/platform/src/com/sun/jna/platform/win32/User32.java
@@ -16,8 +16,6 @@
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.WString;
-import com.sun.jna.platform.win32.BaseTSD.LONG_PTR;
-import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
@@ -1702,4 +1700,97 @@ HDEVNOTIFY RegisterDeviceNotification(HANDLE hRecipient,
*
*/
int RegisterWindowMessage(String string);
+
+ /**
+ * Retrieves a handle to the display monitor that contains a specified point.
+ * @param pt A POINT structure that specifies the point of interest in virtual-screen
+ * coordinates.
+ * @param dwFlags Determines the function's return value if the window does not intersect
+ * any display monitor. This parameter can be one of the following values.
+ * MONITOR_DEFAULTTONEAREST
+ * MONITOR_DEFAULTTONULL
+ * MONITOR_DEFAULTTOPRIMARY
+ * @return If the point is contained by a display monitor, the return value is an HMONITOR
+ * handle to that display monitor. If the point is not contained by a display monitor,
+ * the return value depends on the value of dwFlags.
+ */
+ HMONITOR MonitorFromPoint(POINT pt, int dwFlags);
+
+ /**
+ * Retrieves a handle to the display monitor that has the largest area of intersection with
+ * a specified rectangle.
+ * @param lprc A pointer to a RECT structure that specifies the rectangle of interest in
+ * virtual-screen coordinates.
+ * @param dwFlags Determines the function's return value if the window does not intersect
+ * any display monitor. This parameter can be one of the following values.
+ * MONITOR_DEFAULTTONEAREST
+ * MONITOR_DEFAULTTONULL
+ * MONITOR_DEFAULTTOPRIMARY
+ * @return If the rectangle intersects one or more display monitor rectangles, the return
+ * value is an HMONITOR handle to the display monitor that has the largest area of
+ * intersection with the rectangle. If the rectangle does not intersect a display
+ * monitor, the return value depends on the value of dwFlags.
+ */
+ HMONITOR MonitorFromRect(RECT lprc, int dwFlags);
+
+ /**
+ * Retrieves a handle to the display monitor that has the largest area of intersection with
+ * the bounding rectangle of a specified window.
+ *
+ * If the window is currently minimized, MonitorFromWindow uses the rectangle of the window
+ * before it was minimized.
+ * @param hwnd A handle to the window of interest.
+ * @param dwFlags Determines the function's return value if the window does not intersect
+ * any display monitor. This parameter can be one of the following values.
+ * MONITOR_DEFAULTTONEAREST
+ * MONITOR_DEFAULTTONULL
+ * MONITOR_DEFAULTTOPRIMARY
+ * @return If the window intersects one or more display monitor rectangles, the return value
+ * is an HMONITOR handle to the display monitor that has the largest area of
+ * intersection with the window. If the window does not intersect a display monitor,
+ * the return value depends on the value of dwFlags.
+ */
+ HMONITOR MonitorFromWindow(HWND hwnd, int dwFlags);
+
+ /**
+ * Retrieves information about a display monitor.
+ * @param hMonitor A handle to the display monitor of interest.
+ * @param lpmi A pointer to a {@link WinUser.MONITORINFO} structure that receives information about
+ * the specified display monitor.
+ * @return If the function succeeds, the return value is nonzero. If the function
+ * fails, the return value is zero.
+ */
+ BOOL GetMonitorInfo(HMONITOR hMonitor, MONITORINFO lpmi);
+
+ /**
+ * Retrieves information about a display monitor.
+ * @param hMonitor A handle to the display monitor of interest.
+ * @param lpmi A pointer to a {@link WinUser.MONITORINFOEX} structure that receives information about
+ * the specified display monitor.
+ * @return If the function succeeds, the return value is nonzero. If the function
+ * fails, the return value is zero.
+ */
+ BOOL GetMonitorInfo(HMONITOR hMonitor, MONITORINFOEX lpmi);
+
+ /**
+ * Enumerates display monitors (including invisible pseudo-monitors associated with the mirroring drivers)
+ * that intersect a region formed by the intersection of a specified clipping rectangle and the visible
+ * region of a device context. EnumDisplayMonitors calls an application-defined MonitorEnumProc callback
+ * function once for each monitor that is enumerated. Note that GetSystemMetrics (SM_CMONITORS) counts
+ * only the display monitors.
+ * @param hdc A handle to a display device context that defines the visible region of interest. If this
+ * parameter is NULL, the hdcMonitor parameter passed to the callback function will be NULL, and
+ * the visible region of interest is the virtual screen that encompasses all the displays on the
+ * desktop.
+ * @param lprcClip A pointer to a RECT structure that specifies a clipping rectangle. The region of
+ * interest is the intersection of the clipping rectangle with the visible region specified by hdc.
+ * If hdc is non-NULL, the coordinates of the clipping rectangle are relative to the origin of the
+ * hdc. If hdc is NULL, the coordinates are virtual-screen coordinates. This parameter can be NULL
+ * if you don't want to clip the region specified by hdc.
+ * @param lpfnEnum A pointer to an application-defined callback function.
+ * @param dwData Application-defined data that EnumDisplayMonitors passes directly to the lpfnEnum function.
+ * @return If the function succeeds, the return value is nonzero. If the function fails, the return value
+ * is zero.
+ */
+ BOOL EnumDisplayMonitors(HDC hdc, RECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData);
}
diff --git a/contrib/platform/src/com/sun/jna/platform/win32/WinUser.java b/contrib/platform/src/com/sun/jna/platform/win32/WinUser.java
index aecdc48089..f6a5d44ef9 100644
--- a/contrib/platform/src/com/sun/jna/platform/win32/WinUser.java
+++ b/contrib/platform/src/com/sun/jna/platform/win32/WinUser.java
@@ -23,11 +23,13 @@
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
import com.sun.jna.platform.win32.WinDef.HBRUSH;
import com.sun.jna.platform.win32.WinDef.HCURSOR;
+import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.platform.win32.WinDef.HICON;
import com.sun.jna.platform.win32.WinDef.HINSTANCE;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
+import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.win32.StdCallLibrary;
@@ -875,5 +877,194 @@ public interface WindowProc extends Callback {
*/
LRESULT callback(HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam);
}
-
+
+ /**
+ * Each physical display is represented by a monitor handle of type HMONITOR. A valid HMONITOR
+ * is guaranteed to be non-NULL. A physical display has the same HMONITOR as long as it is part
+ * of the desktop.
+ */
+ public class HMONITOR extends HANDLE {
+
+ /**
+ * Instantiates a new HMONITOR.
+ */
+ public HMONITOR()
+ {
+ }
+
+ /**
+ * Instantiates a new HMONITOR.
+ * @param p the pointer
+ */
+ public HMONITOR(Pointer p)
+ {
+ super(p);
+ }
+ }
+
+
+ /**
+ * Returns NULL.
+ */
+ final int MONITOR_DEFAULTTONULL = 0x00000000;
+
+ /**
+ * Returns a handle to the primary display monitor.
+ */
+ final int MONITOR_DEFAULTTOPRIMARY = 0x00000001;
+
+ /**
+ * Returns a handle to the display monitor that is nearest to the window.
+ */
+ final int MONITOR_DEFAULTTONEAREST = 0x00000002;
+
+ /**
+ * This is the primary display monitor.
+ */
+ final int MONITORINFOF_PRIMARY = 0x00000001;
+
+ /**
+ * Length of the device name in MONITORINFOEX
+ */
+ final int CCHDEVICENAME = 32;
+
+ /**
+ * The MONITORINFO structure contains information about a display monitor.
+ * The {@link MyUser32#GetMonitorInfo(HMONITOR, MONITORINFO)} function stores
+ * information into a MONITORINFO structure
+ * The MONITORINFO structure is a subset of the MONITORINFOEX structure.
+ */
+ public class MONITORINFO extends Structure
+ {
+ /**
+ * The size, in bytes, of the structure.
+ */
+ public int cbSize = size();
+
+ /**
+ * Specifies the display monitor rectangle, expressed in virtual-screen coordinates.
+ * Note that if the monitor is not the primary display monitor, some of the
+ * rectangle's coordinates may be negative values.
+ */
+ public RECT rcMonitor;
+
+ /**
+ * Specifies the work area rectangle of the display monitor that can be used by
+ * applications, expressed in virtual-screen coordinates. Windows uses this rectangle
+ * to maximize an application on the monitor. The rest of the area in rcMonitor
+ * contains system windows such as the task bar and side bars. Note that if the
+ * monitor is not the primary display monitor, some of the rectangle's coordinates
+ * may be negative values.
+ */
+ public RECT rcWork;
+
+ /**
+ * The attributes of the display monitor. This member can be the following value.
+ * MONITORINFOF_PRIMARY
+ */
+ public int dwFlags;
+
+ @Override
+ protected List getFieldOrder()
+ {
+ return Arrays.asList("cbSize", "rcMonitor", "rcWork", "dwFlags");
+ }
+ }
+
+ /**
+ * The MONITORINFOEX structure contains information about a display monitor.
+ * The {@link MyUser32#GetMonitorInfo(HMONITOR, MONITORINFOEX)} function stores
+ * information into a MONITORINFOEX structure
+ * The MONITORINFOEX structure is a superset of the MONITORINFO structure.
+ * The MONITORINFOEX structure adds a string member to contain a name for the display monitor.
+ */
+ public class MONITORINFOEX extends Structure
+ {
+ /**
+ * The size, in bytes, of the structure.
+ */
+ public int cbSize;
+
+ /**
+ * Specifies the display monitor rectangle, expressed in virtual-screen coordinates.
+ * Note that if the monitor is not the primary display monitor, some of the
+ * rectangle's coordinates may be negative values.
+ */
+ public RECT rcMonitor;
+
+ /**
+ * Specifies the work area rectangle of the display monitor that can be used by
+ * applications, expressed in virtual-screen coordinates. Windows uses this rectangle
+ * to maximize an application on the monitor. The rest of the area in rcMonitor
+ * contains system windows such as the task bar and side bars. Note that if the
+ * monitor is not the primary display monitor, some of the rectangle's coordinates
+ * may be negative values.
+ */
+ public RECT rcWork;
+
+ /**
+ * The attributes of the display monitor. This member can be the following value.
+ * MONITORINFOF_PRIMARY
+ */
+ public int dwFlags;
+
+ /**
+ * A string that specifies the device name of the monitor being used. Most
+ * applications have no use for a display monitor name, and so can save some bytes
+ * by using a MONITORINFO structure.
+ */
+ public char[] szDevice;
+
+ public MONITORINFOEX()
+ {
+ szDevice = new char[CCHDEVICENAME];
+ cbSize = size();
+ }
+
+ @Override
+ protected List getFieldOrder()
+ {
+ return Arrays.asList("cbSize", "rcMonitor", "rcWork", "dwFlags", "szDevice");
+ }
+ }
+
+ /**
+ * An application-defined callback function that is called by the {@link MyUser32#EnumDisplayMonitors} function.
+ *
+ * You can use the EnumDisplayMonitors function to enumerate the set of display monitors that intersect
+ * the visible region of a specified device context and, optionally, a clipping rectangle. To do this,
+ * set the hdc parameter to a non-NULL value, and set the lprcClip parameter as needed.
+ *
+ * You can also use the EnumDisplayMonitors function to enumerate one or more of the display monitors on
+ * the desktop, without supplying a device context. To do this, set the hdc parameter of
+ * EnumDisplayMonitors to NULL and set the lprcClip parameter as needed.
+ *
+ * In all cases, EnumDisplayMonitors calls a specified MonitorEnumProc function once for each display
+ * monitor in the calculated enumeration set. The MonitorEnumProc function always receives a handle to
+ * the display monitor. If the hdc parameter of EnumDisplayMonitors is non-NULL, the MonitorEnumProc
+ * function also receives a handle to a device context whose color format is appropriate for the
+ * display monitor. You can then paint into the device context in a manner that is optimal for the
+ * display monitor.
+ */
+ public interface MONITORENUMPROC extends Callback
+ {
+ /**
+ * @param hMonitor A handle to the display monitor. This value will always be non-NULL.
+ * @param hdcMonitor A handle to a device context. The device context has color attributes that are
+ * appropriate for the display monitor identified by hMonitor. The clipping area of the device
+ * context is set to the intersection of the visible region of the device context identified
+ * by the hdc parameter of EnumDisplayMonitors, the rectangle pointed to by the lprcClip
+ * parameter of EnumDisplayMonitors, and the display monitor rectangle.
+ * @param lprcMonitor A pointer to a RECT structure. If hdcMonitor is non-NULL, this rectangle is the
+ * intersection of the clipping area of the device context identified by hdcMonitor and the
+ * display monitor rectangle. The rectangle coordinates are device-context coordinates.
+ * If hdcMonitor is NULL, this rectangle is the display monitor rectangle. The rectangle
+ * coordinates are virtual-screen coordinates.
+ * @param dwData Application-defined data that EnumDisplayMonitors passes directly to the enumeration
+ * function.
+ * @return To continue the enumeration, return TRUE. To stop the enumeration, return FALSE.
+ */
+ public int apply(HMONITOR hMonitor, HDC hdcMonitor, RECT lprcMonitor, LPARAM dwData);
+ }
+
}
diff --git a/contrib/platform/test/com/sun/jna/platform/win32/Dxva2Test.java b/contrib/platform/test/com/sun/jna/platform/win32/Dxva2Test.java
new file mode 100644
index 0000000000..7e41107e3c
--- /dev/null
+++ b/contrib/platform/test/com/sun/jna/platform/win32/Dxva2Test.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2014 Martin Steiger
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sun.jna.platform.win32;
+
+import junit.framework.TestCase;
+
+import com.sun.jna.Memory;
+import com.sun.jna.platform.win32.Dxva2;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_COLOR_TEMPERATURE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DISPLAY_TECHNOLOGY_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DRIVE_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_GAIN_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_POSITION_TYPE;
+import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_SIZE_TYPE;
+import com.sun.jna.platform.win32.LowLevelMonitorConfigurationAPI.MC_TIMING_REPORT;
+import com.sun.jna.platform.win32.PhysicalMonitorEnumerationAPI.PHYSICAL_MONITOR;
+import com.sun.jna.platform.win32.User32;
+import com.sun.jna.platform.win32.WTypes.LPSTR;
+import com.sun.jna.platform.win32.WinDef.DWORD;
+import com.sun.jna.platform.win32.WinDef.DWORDByReference;
+import com.sun.jna.platform.win32.WinDef.POINT;
+import com.sun.jna.platform.win32.WinNT.HANDLE;
+import com.sun.jna.platform.win32.WinUser;
+import com.sun.jna.platform.win32.WinUser.HMONITOR;
+
+
+/**
+ * @author Martin Steiger
+ */
+public class Dxva2Test extends TestCase {
+
+ private int monitorCount;
+ private PHYSICAL_MONITOR[] physMons;
+
+ @Override
+ public void setUp()
+ {
+ HMONITOR hMonitor = User32.INSTANCE.MonitorFromPoint(new POINT(0, 0), WinUser.MONITOR_DEFAULTTOPRIMARY);
+
+ DWORDByReference pdwNumberOfPhysicalMonitors = new DWORDByReference();
+ assertTrue(Dxva2.INSTANCE.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, pdwNumberOfPhysicalMonitors).booleanValue());
+
+ monitorCount = pdwNumberOfPhysicalMonitors.getValue().intValue();
+ physMons = new PHYSICAL_MONITOR[monitorCount];
+ assertTrue(Dxva2.INSTANCE.GetPhysicalMonitorsFromHMONITOR(hMonitor, monitorCount, physMons).booleanValue());
+ }
+
+ @Override
+ public void tearDown()
+ {
+ assertTrue(Dxva2.INSTANCE.DestroyPhysicalMonitors(monitorCount, physMons).booleanValue());
+ }
+
+ public void testGetMonitorTechnologyType()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_DISPLAY_TECHNOLOGY_TYPE.ByReference techType = new MC_DISPLAY_TECHNOLOGY_TYPE.ByReference();
+ Dxva2.INSTANCE.GetMonitorTechnologyType(hPhysicalMonitor, techType);
+ }
+
+ public void testGetMonitorCapabilities()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ DWORDByReference temps = new DWORDByReference();
+ DWORDByReference caps = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorCapabilities(hPhysicalMonitor, caps, temps);
+ }
+
+ public void testGetMonitorBrightness()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ DWORDByReference pdwMinimumBrightness = new DWORDByReference();
+ DWORDByReference pdwCurrentBrightness = new DWORDByReference();
+ DWORDByReference pdwMaximumBrightness = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorBrightness(hPhysicalMonitor, pdwMinimumBrightness, pdwCurrentBrightness, pdwMaximumBrightness);
+ }
+
+ public void testGetMonitorContrast()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ DWORDByReference pdwMinimumContrast = new DWORDByReference();
+ DWORDByReference pdwCurrentContrast = new DWORDByReference();
+ DWORDByReference pdwMaximumContrast = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorContrast(hPhysicalMonitor, pdwMinimumContrast, pdwCurrentContrast, pdwMaximumContrast);
+ }
+
+ public void testGetMonitorColorTemperature()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_COLOR_TEMPERATURE.ByReference pctCurrentColorTemperature = new MC_COLOR_TEMPERATURE.ByReference();
+ Dxva2.INSTANCE.GetMonitorColorTemperature(hPhysicalMonitor, pctCurrentColorTemperature);
+ }
+
+ public void testCapabilitiesRequestAndCapabilitiesReply()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ DWORDByReference pdwCapabilitiesStringLengthInCharacters = new DWORDByReference();
+ Dxva2.INSTANCE.GetCapabilitiesStringLength(hPhysicalMonitor, pdwCapabilitiesStringLengthInCharacters);
+ DWORD capStrLen = pdwCapabilitiesStringLengthInCharacters.getValue();
+
+ LPSTR pszASCIICapabilitiesString = new LPSTR(new Memory(capStrLen.intValue()));
+ Dxva2.INSTANCE.CapabilitiesRequestAndCapabilitiesReply(hPhysicalMonitor, pszASCIICapabilitiesString, capStrLen);
+ }
+
+ public void testGetMonitorDisplayAreaPosition()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_POSITION_TYPE ptPositionType = MC_POSITION_TYPE.MC_HORIZONTAL_POSITION;
+ DWORDByReference pdwMinimumPosition = new DWORDByReference();
+ DWORDByReference pdwCurrentPosition = new DWORDByReference();
+ DWORDByReference pdwMaximumPosition = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorDisplayAreaPosition(hPhysicalMonitor, ptPositionType, pdwMinimumPosition, pdwCurrentPosition, pdwMaximumPosition);
+ }
+
+ public void testGetMonitorDisplayAreaSize()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_SIZE_TYPE ptSizeType = MC_SIZE_TYPE.MC_WIDTH;
+ DWORDByReference pdwMinimumSize = new DWORDByReference();
+ DWORDByReference pdwCurrentSize = new DWORDByReference();
+ DWORDByReference pdwMaximumSize = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorDisplayAreaSize(hPhysicalMonitor, ptSizeType, pdwMinimumSize, pdwCurrentSize, pdwMaximumSize);
+ }
+
+ public void testGetMonitorRedGreenOrBlueGain()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_GAIN_TYPE ptGainType = MC_GAIN_TYPE.MC_RED_GAIN;
+ DWORDByReference pdwMinimumGain = new DWORDByReference();
+ DWORDByReference pdwCurrentGain = new DWORDByReference();
+ DWORDByReference pdwMaximumGain = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorRedGreenOrBlueGain(hPhysicalMonitor, ptGainType, pdwMinimumGain, pdwCurrentGain, pdwMaximumGain);
+ }
+
+ public void testGetMonitorRedGreenOrBlueDrive()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_DRIVE_TYPE ptDriveType = MC_DRIVE_TYPE.MC_RED_DRIVE;
+ DWORDByReference pdwMinimumDrive = new DWORDByReference();
+ DWORDByReference pdwCurrentDrive = new DWORDByReference();
+ DWORDByReference pdwMaximumDrive = new DWORDByReference();
+ Dxva2.INSTANCE.GetMonitorRedGreenOrBlueDrive(hPhysicalMonitor, ptDriveType, pdwMinimumDrive, pdwCurrentDrive, pdwMaximumDrive);
+ }
+
+ public void testGetTimingReport()
+ {
+ HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
+
+ // the method returns FALSE if the monitor driver doesn't support it,
+ // but verifies that the JNA mapping is correct (no exception)
+ MC_TIMING_REPORT pmtrMonitorTimingReport = new MC_TIMING_REPORT();
+ Dxva2.INSTANCE.GetTimingReport(hPhysicalMonitor, pmtrMonitorTimingReport);
+ }
+}
diff --git a/contrib/platform/test/com/sun/jna/platform/win32/User32Test.java b/contrib/platform/test/com/sun/jna/platform/win32/User32Test.java
index 4aa41a763d..72823ef4df 100644
--- a/contrib/platform/test/com/sun/jna/platform/win32/User32Test.java
+++ b/contrib/platform/test/com/sun/jna/platform/win32/User32Test.java
@@ -20,7 +20,16 @@
import junit.framework.TestCase;
+import com.sun.jna.platform.win32.WinDef.HDC;
+import com.sun.jna.platform.win32.WinDef.HWND;
+import com.sun.jna.platform.win32.WinDef.LPARAM;
+import com.sun.jna.platform.win32.WinDef.POINT;
+import com.sun.jna.platform.win32.WinDef.RECT;
+import com.sun.jna.platform.win32.WinUser.HMONITOR;
import com.sun.jna.platform.win32.WinUser.LASTINPUTINFO;
+import com.sun.jna.platform.win32.WinUser.MONITORENUMPROC;
+import com.sun.jna.platform.win32.WinUser.MONITORINFO;
+import com.sun.jna.platform.win32.WinUser.MONITORINFOEX;
/**
* @author dblock[at]dblock[dot]org
@@ -110,4 +119,44 @@ public final void testRegisterWindowMessage() {
final int msg = User32.INSTANCE.RegisterWindowMessage("RM_UNITTEST");
assertTrue(msg >= 0xC000 && msg <= 0xFFFF);
}
+
+ public final void testMonitorFromPoint() {
+ int dwFlags = WinUser.MONITOR_DEFAULTTOPRIMARY;
+
+ POINT pt = new POINT(0, 0);
+ assertNotNull(User32.INSTANCE.MonitorFromPoint(pt, dwFlags));
+ }
+
+ public final void testMonitorFromRect() {
+ int dwFlags = WinUser.MONITOR_DEFAULTTOPRIMARY;
+ RECT lprc = new RECT();
+ assertNotNull(User32.INSTANCE.MonitorFromRect(lprc, dwFlags));
+ }
+
+ public final void testMonitorFromWindow() {
+ int dwFlags = WinUser.MONITOR_DEFAULTTOPRIMARY;
+
+ HWND hwnd = new HWND();
+ assertNotNull(User32.INSTANCE.MonitorFromWindow(hwnd, dwFlags));
+ }
+
+ public final void testGetMonitorInfo() {
+ HMONITOR hMon = User32.INSTANCE.MonitorFromPoint(new POINT(0, 0), WinUser.MONITOR_DEFAULTTOPRIMARY);
+
+ assertTrue(User32.INSTANCE.GetMonitorInfo(hMon, new MONITORINFO()).booleanValue());
+
+ assertTrue(User32.INSTANCE.GetMonitorInfo(hMon, new MONITORINFOEX()).booleanValue());
+ }
+
+ public final void testEnumDisplayMonitors() {
+
+ assertTrue(User32.INSTANCE.EnumDisplayMonitors(null, null, new MONITORENUMPROC() {
+
+ @Override
+ public int apply(HMONITOR hMonitor, HDC hdc, RECT rect, LPARAM lparam)
+ {
+ return 1;
+ }
+ }, new LPARAM(0)).booleanValue());
+ }
}