Commit 4f3b52c6 authored by captainwong's avatar captainwong

add win32/monitor.h

parent 8059c57a
#pragma once
#include <Windows.h>
#include <string>
#include <vector>
namespace jlib {
namespace win32 {
struct MonitorInfo {
struct Resolution {
int w;
int h;
int hz;
bool operator==(const Resolution& r) const {
return w == r.w && h == r.h && hz == r.hz;
}
std::wstring toString() const {
std::wstring res = std::to_wstring(w) + L"x" + std::to_wstring(h)
+ L" " + std::to_wstring(hz) + L"Hz";
return res;
}
bool valid() const {
return !(w == 0 || h == 0 || hz == 0);
}
};
bool isMain = false;
std::wstring name = {};
std::wstring deviceName = {};
std::wstring deviceString = {};
Resolution curResolution = {};
std::vector<Resolution> supportResolutions = {};
bool isResolutionSupport(int w, int h, int hz) const {
for (const auto& r : supportResolutions) {
if (r.w == w && r.h == h && r.hz == hz) { return true; }
}
return false;
}
bool isResolutionSupport(const Resolution& r) const {
for (const auto& l : supportResolutions) {
if (l == r) { return true; }
}
return false;
}
bool valid() const {
return curResolution.valid() && !name.empty() && !deviceName.empty() && !supportResolutions.empty();
}
std::wstring toString(bool withSupportRes = false) const {
std::wstring str = L"{\n";
str += L" isMain : "; str += isMain ? L"true" : L"false"; str += L"\n";
str += L" name : " + name + L"\n";
str += L" deviceName : " + deviceName + L"\n";
str += L" deviceString : " + deviceString + L"\n";
str += L" curResolution : " + curResolution.toString() + L"\n";
if (withSupportRes) {
str += L" supportResolutions : {\n";
for (const auto& res : supportResolutions) {
str += L" " + res.toString() + L"\n";
}
str += L" }\n";
}
str += L"}\n";
return str;
}
};
typedef std::vector<MonitorInfo> MonitorInfos;
static MonitorInfos getMonitors()
{
MonitorInfos mis;
BOOL ret = FALSE;
DWORD iDevNum = 0;
do {
DISPLAY_DEVICE displayDevice;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(displayDevice);
ret = EnumDisplayDevicesW(NULL, iDevNum, &displayDevice, 0);
//qDebug("StateFlags 0x%X",displayDevice.StateFlags);
if (ret && (displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
//MYQDEBUG << "Device #" << iDevNum;
//dumpDISPLAY_DEVICE(displayDevice);
MonitorInfo mi;
mi.deviceName = displayDevice.DeviceName;
mi.deviceString = displayDevice.DeviceString;
if (displayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
mi.isMain = true;
}
DEVMODE dm = { 0 };
dm.dmSize = sizeof(dm);
EnumDisplaySettings(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &dm);
mi.curResolution.w = dm.dmPelsWidth;
mi.curResolution.h = dm.dmPelsHeight;
mi.curResolution.hz = dm.dmDisplayFrequency;
for (int i = 0; 0 != EnumDisplaySettingsW(displayDevice.DeviceName, i, &dm); i++) {
MonitorInfo::Resolution r{ (int)dm.dmPelsWidth, (int)dm.dmPelsHeight, (int)dm.dmDisplayFrequency };
if (!mi.isResolutionSupport(r)) {
mi.supportResolutions.push_back(r);
}
}
// detached device, use first supportted res
if (!mi.supportResolutions.empty()) {
if (!mi.curResolution.valid()) {
mi.curResolution = mi.supportResolutions.front();
}
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
int iMonitorNum = 0;
if (EnumDisplayDevices(displayDevice.DeviceName, iMonitorNum, &dd, 0)) {
//MYQDEBUG << "Device #" << iDevNum << "Monitor #" << iMonitorNum;
//dumpDISPLAY_DEVICE(dd);
std::wstring name = dd.DeviceString;
if (name != L"Generic PnP Monitor" && name != L"通用即插即用监视器") {
mi.name = name;
} else {
std::wstring deviceId = dd.DeviceID;
deviceId = deviceId.substr(8, deviceId.find(L"\\", 9) - 8);
mi.name = deviceId;
}
//dumpMoniterInfo(mi);
mis.push_back(mi);
ZeroMemory(&dd, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
iMonitorNum++;
}
} else {
#ifdef _DEBUG
//MYQDEBUG << "no supported resolutions!";
#endif
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
int iMonitorNum = 0;
if (EnumDisplayDevices(displayDevice.DeviceName, iMonitorNum, &dd, 0)) {
//MYQDEBUG << "Device #" << iDevNum << "Monitor #" << iMonitorNum;
//dumpDISPLAY_DEVICE(dd);
std::wstring name = dd.DeviceString;
if (name != L"Generic PnP Monitor" && name != L"通用即插即用监视器") {
mi.name = name;
} else {
std::wstring deviceId = dd.DeviceID;
deviceId = deviceId.substr(8, deviceId.find(L"\\", 9) - 8);
mi.name = deviceId;
}
//dumpMoniterInfo(mi);
mis.push_back(mi);
ZeroMemory(&dd, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
iMonitorNum++;
}
}
}
iDevNum++;
} while (ret);
return mis;
}
//! 设置显示模式:扩展模式
static bool setExtendMode() {
auto ret = SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTEND | SDC_APPLY);
//MYQDEBUG << "SetDisplayConfig SDC_TOPOLOGY_EXTEND returns:" << (ret == ERROR_SUCCESS);
return ret == ERROR_SUCCESS;
}
//! 设置显示模式:克隆模式
static bool setCloneMode() {
auto ret = SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_CLONE | SDC_APPLY);
//MYQDEBUG << "SetDisplayConfig SDC_TOPOLOGY_CLONE returns:" << (ret == ERROR_SUCCESS);
return ret == ERROR_SUCCESS;
}
//void setOnlyDisplayInMainMonitor() {
// auto ret = SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_INTERNAL | SDC_APPLY);
// MYQDEBUG << "SetDisplayConfig SDC_TOPOLOGY_EXTEND returns:" << ret;
//}
//
//void setOnlyDisplayInSecondMonitor() {
// auto ret = SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTERNAL | SDC_APPLY);
// MYQDEBUG << "SetDisplayConfig SDC_TOPOLOGY_EXTERNAL returns:" << ret;
//}
//! 设置后必须提交,否则不生效
static bool commitChange() {
auto ret = ChangeDisplaySettingsExW(NULL, NULL, NULL, 0, NULL);
//MYQDEBUG << "commitChange ChangeDisplaySettingsExW returns:" << (ret == ERROR_SUCCESS);
return ret == ERROR_SUCCESS;
};
/*
* @brief 禁用某个显示器
* @param deviceName MonitorInfo::deviceName
*/
static bool disableMonitor(const std::wstring& deviceName) {
DEVMODEW dm = { 0 };
dm.dmSize = sizeof(dm);
dm.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
dm.dmPelsWidth = dm.dmPelsHeight = 0;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_GLOBAL | CDS_NORESET;
auto ret = ChangeDisplaySettingsExW(deviceName.data(), &dm, nullptr, dwFlags, nullptr);
//MYQDEBUG << "disableMonitor ChangeDisplaySettingsExW returns:" << (ret == ERROR_SUCCESS);
return commitChange();
}
/*
* @brief 设置主显示器
* @param newMain 新的主显示器
* @param oldMain 旧的主显示器
*/
static bool setMainMonitor(const MonitorInfo& newMain, const MonitorInfo& oldMain) {
auto moveOld = [](const MonitorInfo& newMain, const MonitorInfo& oldMain) {
DEVMODEW dm = { 0 };
dm.dmSize = sizeof(dm);
dm.dmFields = DM_POSITION;
dm.dmPosition.x = newMain.curResolution.w;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_GLOBAL | CDS_NORESET;
auto ret = ChangeDisplaySettingsExW(oldMain.deviceName.data(), &dm, nullptr, dwFlags, nullptr);
//MYQDEBUG << "moveOld ChangeDisplaySettingsExW returns:" << (ret == ERROR_SUCCESS);
return ret == ERROR_SUCCESS;
};
auto moveNew = [](const MonitorInfo& newMain) {
DEVMODEW dm = { 0 };
dm.dmSize = sizeof(dm);
dm.dmFields = DM_POSITION;
dm.dmPosition.x = dm.dmPosition.y = 0;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_GLOBAL | CDS_NORESET | CDS_SET_PRIMARY;
auto ret = ChangeDisplaySettingsExW(newMain.deviceName.data(), &dm, nullptr, dwFlags, nullptr);
//MYQDEBUG << "moveNew ChangeDisplaySettingsExW returns:" << (ret == ERROR_SUCCESS);
return ret == ERROR_SUCCESS;
};
moveOld(newMain, oldMain);
moveNew(newMain);
return commitChange();
}
//! 修改显示器分辨率、刷新率
static bool changeResolution(const MonitorInfo& monitor, const MonitorInfo::Resolution& res) {
DEVMODEW dm = { 0 };
dm.dmSize = sizeof(dm);
dm.dmPelsWidth = res.w;
dm.dmPelsHeight = res.h;
dm.dmDisplayFrequency = res.hz;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
DWORD dwFlags = CDS_UPDATEREGISTRY | CDS_GLOBAL;
auto ret = ChangeDisplaySettingsExW(monitor.deviceName.data(), &dm, nullptr, dwFlags, nullptr);
//MYQDEBUG << "changeResolution ChangeDisplaySettingsExW returns:" << (ret == ERROR_SUCCESS);
return commitChange();
}
}
}
...@@ -56,6 +56,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "win32", "win32", "{B5D9E71E ...@@ -56,6 +56,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "win32", "win32", "{B5D9E71E
..\jlib\win32\deviceuniqueidentifier.h = ..\jlib\win32\deviceuniqueidentifier.h ..\jlib\win32\deviceuniqueidentifier.h = ..\jlib\win32\deviceuniqueidentifier.h
..\jlib\win32\file_op.h = ..\jlib\win32\file_op.h ..\jlib\win32\file_op.h = ..\jlib\win32\file_op.h
..\jlib\win32\memory_micros.h = ..\jlib\win32\memory_micros.h ..\jlib\win32\memory_micros.h = ..\jlib\win32\memory_micros.h
..\jlib\win32\monitor.h = ..\jlib\win32\monitor.h
..\jlib\win32\MyWSAError.h = ..\jlib\win32\MyWSAError.h ..\jlib\win32\MyWSAError.h = ..\jlib\win32\MyWSAError.h
..\jlib\win32\odbccp32.lib = ..\jlib\win32\odbccp32.lib ..\jlib\win32\odbccp32.lib = ..\jlib\win32\odbccp32.lib
..\jlib\win32\path_helper.h = ..\jlib\win32\path_helper.h ..\jlib\win32\path_helper.h = ..\jlib\win32\path_helper.h
...@@ -291,6 +292,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simple7zwrapper", "simple7z ...@@ -291,6 +292,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simple7zwrapper", "simple7z
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_strutil", "test_strutil\test_strutil.vcxproj", "{0C743CE7-E49C-47F8-BC53-13929EA5CDA3}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_strutil", "test_strutil\test_strutil.vcxproj", "{0C743CE7-E49C-47F8-BC53-13929EA5CDA3}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_monitor", "test_monitor\test_monitor.vcxproj", "{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
...@@ -589,6 +592,14 @@ Global ...@@ -589,6 +592,14 @@ Global
{0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x64.Build.0 = Release|x64 {0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x64.Build.0 = Release|x64
{0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x86.ActiveCfg = Release|Win32 {0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x86.ActiveCfg = Release|Win32
{0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x86.Build.0 = Release|Win32 {0C743CE7-E49C-47F8-BC53-13929EA5CDA3}.Release|x86.Build.0 = Release|Win32
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Debug|x64.ActiveCfg = Debug|x64
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Debug|x64.Build.0 = Debug|x64
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Debug|x86.ActiveCfg = Debug|Win32
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Debug|x86.Build.0 = Debug|Win32
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Release|x64.ActiveCfg = Release|x64
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Release|x64.Build.0 = Release|x64
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Release|x86.ActiveCfg = Release|Win32
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -655,6 +666,7 @@ Global ...@@ -655,6 +666,7 @@ Global
{ECF057F3-AB01-4129-8C5C-E59DD4261770} = {5AFB3C82-FDEA-458C-9B56-E28A3F96F113} {ECF057F3-AB01-4129-8C5C-E59DD4261770} = {5AFB3C82-FDEA-458C-9B56-E28A3F96F113}
{41C26D67-0174-41AC-850E-1F84181138E5} = {729A65CE-3F07-4C2E-ACDC-F9EEC6477F2A} {41C26D67-0174-41AC-850E-1F84181138E5} = {729A65CE-3F07-4C2E-ACDC-F9EEC6477F2A}
{0C743CE7-E49C-47F8-BC53-13929EA5CDA3} = {ABCB8CF8-5E82-4C47-A0FC-E82DF105DF99} {0C743CE7-E49C-47F8-BC53-13929EA5CDA3} = {ABCB8CF8-5E82-4C47-A0FC-E82DF105DF99}
{5EA0AFE3-134D-4573-B8E7-ADEC802722DF} = {0E6598D3-602D-4552-97F7-DC5AB458D553}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A8EBEA58-739C-4DED-99C0-239779F57D5D} SolutionGuid = {A8EBEA58-739C-4DED-99C0-239779F57D5D}
......
#include "../../jlib/win32/monitor.h"
#include <stdio.h>
using namespace jlib::win32;
int main()
{
auto mis = getMonitors();
printf("total %zu monitors:\n", mis.size());
for (const auto& mi : mis) {
wprintf(mi.toString(true).data());
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{5EA0AFE3-134D-4573-B8E7-ADEC802722DF}</ProjectGuid>
<RootNamespace>testmonitor</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="test_monitor.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\jlib\win32\monitor.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="test_monitor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\jlib\win32\monitor.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment