2010-10-04 35 views
11

我經常用連接在另一臺計算機上的KVM切換器啓動我的Windows 7 PC。當我切換到啓動的PC時,顯示分辨率錯誤(並且未檢測到第二個連接的顯示器)。如何在Windows中強制顯示檢測?

我可以通過右鍵單擊桌面,選擇Screen Resolution並單擊Detect來更正此問題。這使Windows檢測到連接的顯示器並調整到最佳分辨率。

我想寫一個小工具來自動執行此操作。我應該使用哪種Win32 API調用或C#對象?

+0

我沒有刷新選項。這可能是視頻卡製造商的附加組件。 – 2010-10-04 21:35:20

+0

對不起,漢斯,它實際上是說'檢測' - 我編輯了這個問題。我相信這是一個標準的按鈕。 – 2010-10-04 23:49:02

回答

1

你可以試試:

  1. 您可以使用間諜++來搜索是開放的,看看他們的財產和信息的窗口。
  2. 使用過程來啓動「rundll32.exe shell32.dll,Control_RunDLL desk.cpl」或者直接調用它來試驗,看看你是否可以得到一個窗口句柄,查看下面鏈接的想法。
  3. 使用代碼"send button click to external app"並對其進行修改以搜索帶有標題「屏幕分辨率」的窗口,並向標題爲「檢測」的子窗口發送BN_CLICK。
  4. 由於計算機已經啓動,因此可能需要在登錄時自動啓動計算機,以便使用任務計劃程序。
+0

如果由於某種原因無法使用任務計劃程序,請嘗試將其設置爲以管理員身份運行,因爲Win7 UAC會很麻煩。 – Marlon 2010-10-08 05:02:42

1

不知道這是否適合你,但你可以嘗試這樣的事情。至少它可以讓你開始。

[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); 
    } 
} 
+0

gah,這可能是C/C++中的一個班輪,當C/C++在這裏是自然選擇時,爲什麼人們會用C#來打擾他們,併爲此而走出困境? – 2013-05-18 11:55:37

+1

也許是因爲他要求C#。 – 2013-06-24 16:46:02

1

這將讓你有中途:

執行:CONTROL.EXE的desk.cpl,設置,@設置

這將直接帶來了屏幕分辨率面板。

我也可能會建議一個腳本工具,如http://en.wikipedia.org/wiki/Windows_Script_Host 然後編寫一個實用程序來打開面板並單擊按鈕。

除非控制面板可能會直接調用windows.dll,您可以直接在代碼中加載和調用該代碼,但這需要一些偵測來檢測。 (你可以通過在調試器中運行.cpl開始,看看當你點擊檢測時會發生什麼)。

1

爲什麼不只是使用Do It Again並編寫一個宏,通過記錄鼠標和鍵盤操作來重置分辨率?