ChangeDisplaySettingsExの回転処理
- 題名: ChangeDisplaySettingsExの回転処理
- 著者: くれない
- 日時: 2012/01/05 21:06:51
- ID: 29555
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: ChangeDisplaySettingsExの回転処理
- 著者: オショウ
- 日時: 2012/01/05 21:53:38
- ID: 29556
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: ChangeDisplaySettingsExの回転処理
- 著者: くれない
- 日時: 2012/01/06 18:51:49
- ID: 29564
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: ChangeDisplaySettingsExの回転処理
- 著者: オショウ
- 日時: 2012/01/06 19:06:01
- ID: 29565
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: ChangeDisplaySettingsExの回転処理
- 著者: くれない
- 日時: 2012/01/06 22:03:50
- ID: 29566
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: ChangeDisplaySettingsExの回転処理
- 著者: オショウ
- 日時: 2012/01/06 23:06:26
- ID: 29567
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: ChangeDisplaySettingsExの回転処理
- 著者: くれない
- 日時: 2012/01/07 14:05:50
- ID: 29569
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になっております。
ChangeDisplaySettingsExを使いディスプレイの縦と横の
切り替えを考えております。
(回転のない解像度の切り替えはできております)
しかし、幅と高さを入れ替え、90度の回転を行うとDISP_
CHANGE_BADMODE(-2)が返ってきます。
180度に関してはDISP_CHANGE_SUCCESSFUL(0)になりますが、
0度のままです。
サポート外の可能性を考え、IsCheckDisplayRotate()という
自作メソッドを作り試したら、サポート外の動きになりまし
た。
しかし、OS標準で備わっている「画面の解像度」では、縦に
切り替え可能です。
最後に、検証したコードを掲載いたします。
ご示教頂ければ幸いです。
>検証コード
using System;
using System.Runtime.InteropServices;
namespace OneButtonDisplaySetting
{
class Sample
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
short dmOrientation;
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;
short dmScale;
short dmCopies;
short dmDefaultSource;
short dmPrintQuality;
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmFormName;
public short dmLogPixels;
public int dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmDisplayOrientation;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct DISPLAY_DEVICE
{
[MarshalAs(UnmanagedType.U4)]
public int cb;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DeviceName;
//[MarshalAs(UnmanagedType.U4)]
//public DisplayDeviceStateFlags StateFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceKey;
}
private sealed class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
internal static extern int ChangeDisplaySettingsEx(
string lpszDeviceName,
ref DEVMODE lpDevMode,
IntPtr hwnd,
uint dwflags,
IntPtr lParam);
public const int CDS_TEST = 0x00000002;
public const int DM_PELSWIDTH = 0x00080000;
public const int DM_PELSHEIGHT = 0x00100000;
public const int DM_DISPLAYORIENTATION = 0x00800000;
public const int DM_DISPLAYQUERYORIENTATION = 0x01000000;
public const int ENUM_CURRENT_SETTINGS = -1;
public const int DMDO_DEFAULT = 0;
public const int DMDO_90 = 1;
public const int DMDO_180 = 2;
public const int DMDO_270 = 4;
public const int DISP_CHANGE_SUCCESSFUL = 0;
// 省略
}
/// <summary>
/// (C言語のサンプルを参考)縦・横の切り替えが可能か?
/// </summary>
/// <returns></returns>
public bool IsCheckDisplayRotate()
{
DISPLAY_DEVICE d = new DISPLAY_DEVICE();
DEVMODE dm = new DEVMODE();
int ret;
dm.dmSize = (short)Marshal.SizeOf(dm);
dm.dmFields = NativeMethods.DM_DISPLAYQUERYORIENTATION;
ret = NativeMethods.ChangeDisplaySettingsEx(
d.DeviceName,
ref dm,
IntPtr.Zero,
NativeMethods.CDS_TEST,
IntPtr.Zero);
if (ret == NativeMethods.DISP_CHANGE_SUCCESSFUL)
{
if (dm.dmDisplayOrientation == 0)
{
// このメソッドを試すと、ここを通る。
return false;
}
else
{
return true;
}
}
return false;
}
public int Change(int iWidth, int iHeight, int iMdo)
{
// 省略
}
}
}