如何在Windows中强制显示检测?

时间:2010-10-04 20:25:05

标签: c# windows winapi monitor

我经常使用附加的KVM切换器启动我的Windows 7 PC,专注于另一台计算机。当我切换到启动的PC时,显示分辨率错误(并且未检测到第二个连接的监视器)。

我可以通过右键单击桌面,选择Screen Resolution并点击Detect来更正此问题。这使Windows可以检测附加的显示并调整到最佳分辨率。

我想写一个小实用程序来自动执行此操作。我应该使用哪个Win32 API调用或C#对象?

4 个答案:

答案 0 :(得分:1)

这会让你在中途:

执行:control.exe desk.cpl,设置,@设置

这将直接打开屏幕分辨率面板。

我可能还会建议像http://en.wikipedia.org/wiki/Windows_Script_Host这样的脚本工具 并编写一个实用程序,打开面板并单击按钮。

除非控制面板可能直接调用windows .dll,您可以直接在代码中加载和调用,但这需要进行一些检测。 (您可以先在调试器中运行.cpl,然后查看单击检测时会发生什么)。

答案 1 :(得分:1)

您可以尝试:

  1. 您可以使用Spy ++搜索打开的窗口并查看其属性和消息。
  2. 使用进程启动“rundll32.exe shell32.dll,Control_RunDLL desk.cpl”或尝试直接调用它以查看是否可以获取窗口句柄,请查看以下链接以获取提示。
  3. 使用代码"send button click to external app"并修改代码以搜索带有“屏幕分辨率”标题的窗口,并将BN_CLICK发送到子窗口,标题为“检测”。
  4. 由于计算机已经打开,您可能希望在登录时自动启动它,为此使用任务计划程序。

答案 2 :(得分:1)

为什么不使用Do It Again并编写一个通过录制鼠标和键盘操作来重置分辨率的宏?

答案 3 :(得分:0)

不确定这是否适合您,但您可以尝试这样的事情。至少它可以让你开始。

[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 714)]
public struct DISPLAY_DEVICE
{
    [FieldOffset(0)]
    public int cb;
    [FieldOffset(4)]
    public char DeviceName;
    [FieldOffset(68)]
    public char DeviceString;
    [FieldOffset(324)]
    public int StateFlags;
    [FieldOffset(328)]
    public char DeviceID;
    [FieldOffset(584)]
    public char DeviceKey;
}

[DllImport("User32.dll", SetLastError = true)]
static extern Boolean EnumDisplayDevices(
        string lpDevice,
        uint iDevNum,
        ref DISPLAY_DEVICE lpDisplayDevice,
        uint dwFlags
);

public void DetectDevices()
{
    var flag = true;
    for (uint i = 0; flag && i < 100; i++)
    {
        var device = new DISPLAY_DEVICE();
        device.cb = Marshal.SizeOf(device);
        flag = EnumDisplayDevices(null, i, ref device, 1);
    }
}