2013-10-28 18 views
5

Tôi đang cố gắng làm theo các hướng dẫn trên MSDN given here để vô hiệu hóa màn hình phụ.Làm thế nào để vô hiệu hóa một màn hình phụ (với ChangeDisplaySettingsEx)?

Tôi đang cố gắng sử dụng cụ thể bộ chức năng này để cho phép khả năng tương thích với các phiên bản cũ hơn của Windows.

Tuy nhiên, tôi không thể quản lý tắt màn hình. Tôi đang chạy và thử nghiệm này trên Windows 7 x64. Tất cả những gì tôi nhận được là một màn hình nhấp nháy. Mã chắc chắn phát hiện màn hình đúng cách - Tôi đã quản lý để thay đổi độ phân giải và xem chế độ hiển thị của nó dễ dàng.

Dưới đây là (phần) của mã của tôi - tôi đã cố gắng rất nhiều biến thể trên các lĩnh vực cho devmode

DEVMODE deleteScreenMode; 
ZeroMemory(&deleteScreenMode, sizeof(DEVMODE)); 
deleteScreenMode.dmSize = sizeof(DEVMODE); 
deleteScreenMode.dmDriverExtra = 0; 
deleteScreenMode.dmFields = DM_POSITION | DM_PELSHEIGHT | DM_PELSWIDTH; 
deleteScreenMode.dmPelsWidth = 0; 
deleteScreenMode.dmPelsHeight = 0; 

POINTL delete; 
deleteion.x=0; 
deleteion.y=0; 
deleteScreenMode.dmPosition = deleteion; 

LONG result = ChangeDisplaySettingsEx(devName, 
             &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY, 
             NULL); 

Có ai có kinh nghiệm với điều này? Cảm ơn

+0

Theo bài viết đã đề cập, mặt nạ 'dmFields' chứa nhiều cờ hơn. Có lẽ phải được thiết lập (và các trường tương ứng zeroed) để tách màn hình? – valdo

+0

Tôi đã thử điều đó, nó không hoạt động. Trong ví dụ của họ, họ sử dụng tất cả các cờ có thể - khi tôi làm điều đó, nó phàn nàn rằng chế độ đã cho không hợp lệ. Khi tôi xóa cờ DM_BITSPERPEL nó hoạt động, nhưng kết quả không thay đổi. Các màn hình flick và vẫn hoạt động. – Alex

Trả lời

2

Tôi đã quyết định chuyển sang một vấn đề khác - thiết lập màn hình chính - và bởi may mắn tôi đã vấp vào giải pháp. Có 2 điều kiện để tắt màn hình không được chỉ định ở bất kỳ đâu: 1) Bạn không thể vô hiệu hóa màn hình động - bạn phải sử dụng CDS_UPDATEREGISTRY để ghi nó vào sổ đăng ký. 2) Quan trọng hơn, vì một số lý do lạ, trước tiên bạn phải lưu trữ thay đổi trong sổ đăng ký (có hoặc không có CDS_NORESET, không quan trọng), và sau đó sử dụng lại ChangeDisplaySettingsEx với giá trị NULL để thực hiện thay đổi. Điều này có thể có cái gì để làm cả hai màn hình kết nối với thiết bị hiển thị cùng, tôi không chắc chắn ...

Dù sao đây là mã mà làm việc cho tôi:

result = ChangeDisplaySettingsEx(devName, &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY | CDS_NORESET , 
             NULL); 
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL); 

Hy vọng nó sẽ giúp một ai đó một nơi nào đó vào một ngày nào đó.

0

Một giải pháp tương tự được ám chỉ ở đây:

http://support.microsoft.com/kb/308216

này làm việc cho gắn màn hình. Tuy nhiên, thậm chí được trang bị kiến ​​thức đó, tài liệu ChangeDisplaySettingsEx về cách tách một màn hình cũng sai về các trường DevMode cần được đặt. Như bạn đã nhận thấy, bạn phải đặt không chỉ DM_POSITION, mà còn DM_PELSHEIGHT | DM_PELSWIDTH.

Trong Windows 7 có API SetDisplayConfig mới, nhưng tôi chưa có kinh nghiệm cá nhân với nó. Hy vọng rằng nó được tài liệu tốt hơn!

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