2010-10-04 29 views
11

Tôi thường khởi động máy tính Windows 7 bằng công tắc KVM kèm theo tập trung vào một máy tính khác. Khi tôi chuyển sang PC khởi động, độ phân giải màn hình sai (và không phát hiện được màn hình kèm theo thứ hai).Làm thế nào tôi có thể bắt buộc phát hiện hiển thị trong Windows?

Tôi có thể sửa lỗi này bằng cách nhấp chuột phải vào màn hình, chọn Screen Resolution và nhấp vào Detect. Điều này làm cho Windows phát hiện các màn hình đính kèm và điều chỉnh theo độ phân giải tối ưu nhất.

Tôi muốn viết một tiện ích nhỏ để thực hiện việc này một cách tự động. Cuộc gọi API Win32 hoặc đối tượng C# nào tôi nên sử dụng?

+0

Tôi không có tùy chọn Làm mới. Đây có thể là một tiện ích bổ sung từ nhà sản xuất card màn hình. –

+0

Xin lỗi, Hans, nó thực sự nói 'Phát hiện' - tôi đã chỉnh sửa câu hỏi. Tôi tin rằng đó là một nút tiêu chuẩn. –

Trả lời

1

Bạn có thể thử:

  1. Bạn có thể sử dụng Spy ++ để tìm kiếm các cửa sổ đang mở và hãy nhìn vào tài sản và thông điệp của họ.
  2. Sử dụng quy trình để bắt đầu "rundll32.exe shell32.dll, Control_RunDLL desk.cpl" hoặc thử nghiệm gọi trực tiếp để xem bạn có thể nhận được cửa sổ xử lý hay không, kiểm tra liên kết bên dưới để biết ý tưởng.
  3. Sử dụng mã "send button click to external app" và sửa đổi nó để tìm kiếm cửa sổ có chú thích "Độ phân giải màn hình" và gửi BN_CLICK tới cửa sổ con với chú thích "Phát hiện".
  4. Vì máy tính đã bật, bạn có thể tự động kích hoạt tính năng này khi đăng nhập, để sử dụng công cụ lên lịch tác vụ.
+0

Nếu vì một lý do nào đó không hoạt động với công cụ lập lịch tác vụ, hãy thử cài đặt nó để chạy với tư cách quản trị viên của bạn vì Win7 UAC có thể gây phiền toái. – Marlon

1

Không chắc chắn điều này có hiệu quả với bạn hay không, nhưng bạn có thể thử một cái gì đó như thế này. Ít nhất nó có thể giúp bạn bắt đầu.

[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 và đó có thể là một lớp lót trong C/C++, tại sao mọi người bận tâm và đi ra khỏi con đường của họ với C# khi C/C++ là sự lựa chọn tự nhiên ở đây? –

+1

Có thể vì anh ấy đã yêu cầu C#. –

1

Điều này sẽ giúp bạn có được một nửa chiều có:

Execute: desk.cpl control.exe, Cài đặt, @ Cài đặt

Điều đó sẽ đưa lên bảng Độ phân giải màn hình trực tiếp.

Tôi cũng có thể đề xuất công cụ tạo tập lệnh như http://en.wikipedia.org/wiki/Windows_Script_Host Và viết tiện ích mở bảng điều khiển và nhấp vào nút.

Chặn rằng có thể bảng điều khiển trực tiếp gọi vào một cửa sổ .dll mà bạn có thể tải và gọi trực tiếp bằng mã, nhưng điều đó sẽ yêu cầu một số tính năng dò tìm. (bạn có thể bắt đầu bằng cách chạy .cpl trong trình gỡ lỗi và xem điều gì xảy ra khi bạn nhấp vào phát hiện).

1

Tại sao không chỉ sử dụng Do It Again và viết macro đặt lại độ phân giải cho bạn bằng cách ghi lại hành động bàn phím và chuột?

Các vấn đề liên quan