プログラムで2番目のモニターを有効にし、C#でWindowsデスクトップをそのモニターに拡張することは可能ですか?下の画像のチェックボックスをオンにするのと同じことを行う必要があります。
5 に答える
あなたが基本的にする必要があること:
EnumDisplayDevices() API 呼び出しを使用して、システム上のディスプレイ デバイスを列挙し、
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
フラグ セット (これにはミラーリング デバイスが含まれるため、すべてが物理ディスプレイになるわけではありません。) 有効なディスプレイ モードを取得して変更する必要があるディスプレイ デバイスが見つかったら、EnumDisplaySettingsEx( ) API 呼び出し - 通常、使用可能なすべてのモードを表示し、ユーザーが選択できるようにしますが、あなたのケースでは、これをハードコードして追加の手順を節約できるように思えます。アプリケーションの将来性を確保するために、毎回ソースを掘り下げることなく簡単に変更できるようにすることをお勧めしますが、レジストリ キーは当然の選択です。整理したら、DevMode ディスプレイ構造にディスプレイの配置に関する情報を入力します (PelsWidth/Height、Position、DisplayFrequency および BitsPerPel プロパティ) を使用して、これらのフラグをフィールド メンバに設定します。最後に、この設定構造で ChangeDisplaySettingsEx() を呼び出し、必ずリセットおよび更新レジストリ フラグを送信してください。必要なのはそれだけです。これがお役に立てば幸いです。
PInvoke を使用したDISPLAY_DEVICE構造体のインポート
EnumDisplayDevices関数のインポート
EnumDisplaySettingsEx関数のインポート
など。残りの機能は、名前で簡単に検索して見つけることができます。
Windows 7 を使用している場合は、プロセスを開始するだけです。
private static Process DisplayChanger = new Process
{
StartInfo =
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "DisplaySwitch.exe",
Arguments = "/extend"
}
};
次に DisplayChanger.Start();
ここで完全な答えはわかりませんが、これを行うには .Net から呼び出す必要があるとほぼ確信しています。アンマネージ dll を呼び出すには、Pinvoke を使用する必要があります。このための優れたリソースは pinvoke.net です。
私は簡単な検索を行い、http: //www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html を見つけましたが、これはおそらくあなたが望むものではありませんが、おそらく pinvoke.net のどこかにあるでしょう。
私は同じ解決策を探しています。ChangeDisplaySettingsEx
PInvokeで呼び出す次のコードを作成しました。
DEVMODE dm = new DEVMODE();
dm.dmSize = (short)Marshal.SizeOf(dm);
dm.dmPelsWidth = 1680;
dm.dmPelsHeight = 1050;
dm.dmBitsPerPel = 32;
dm.dmDisplayFrequency = 60;
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH |
DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY;
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero);
Console.WriteLine("result = " + res.ToString());
モニターが既に有効になっている場合、これにより解像度が正常に変更されます。ただし、モニターがまだデスクトップに接続されていない場合は、アクティブ化されません。それで、誰かが動作するコード例を持っていますか?
モニターを有効にするには、次のように位置を 0,0 以外に設定します。
POINTL enabledPosition = new POINTL();
enabledPosition.x = -1280;
enabledPosition.y = 0;
dm.dmPosition = enabledPosition;
dm.dmFields = DM.Position;
res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);