来自: http://yunjuihuang.pixnet.net/blog/post/5329259
1、當顯示卡支援雙螢幕則如何延伸桌面視窗至第二個螢幕和旋轉螢幕的顯示角度:
1-1: 主要使用下列三個Windows API:
一、 EnumDisplayDevices :取得目前顯示設備基本資訊
二、EnumDisplaySettings:取得特定顯示設備的參數值
三、ChangeDisplaySettingsEx :設定特定顯示設備的參數值
1-2: 在C#中必須透過DllImport才能使用Widnows API的相關函數:
Ex: using System.Runtime.InteropServer;
[DllImport("user32.dll",SetLastError = true)]
static extern int ChangeDisplaySettingsEx(
string lpszDeviceName,
ref DEVMODE lpDevMode,
IntPtr hwnd,
uint dwflags,
IntPtr lParam
);
1-3、設定延伸桌面至第二個螢幕主要將DEVMODE中的dmPosition參數,設定的方法如下:
1-3-1、水平延伸:將dmPosition.x設定為第一個螢幕的寬度加一 ,和dmPosition.y設為0
1-3-2、垂直延伸:將dmPosition.y設定為第一個螢幕的高度加一,和dmPosition.x設為0
1-4、執行ChangeDisplaySettingsEx函式之前必須先設定dmFields |= DM_POSITION。
1-5、旋轉螢幕畫面主要是設定dmDisplayOrientation 和重新設定dmPelsWidth和dmpelsHeight
1-5-1: dmDisplayOrientation 用來設定螢幕顯示的角度:
(1) 0 (0 degrees) (2) 1 (90 degrees) (3) 2 (180 degrees) (4) 3 (270 degrees)
1-5-2:當進行90 dregrees 和270 dregrees的旋轉時必須將dmPelsWidth和dmpelsHeight
的數值交換,避免發生解析度不支援的問題。
(PS:在一般的筆電LCD Port上的螢幕,無法成功的旋轉螢幕的角度)
1-6、最後執行ChangeDisplaySettingsEx函式,此外如果要進行儲存和立即更新則必須設定
下列兩個參數:
1、CDS_UPDATEREGISTRY : 更新登錄檔的資料
2、CDS_RESET:立即更新顯示設定
2、如何使用Windows API讓螢幕進入省電模式:
2-1、主要使用SendMessage函式來設定螢幕的狀態。
2-2、在C#中必須透過DllImport才能使用Widnows API的相關函數:
using System.Runtime.InteropServer;
[DllImport("user32.dll",SetLastError = true)]
static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
2-3、螢幕可以設定下列三種狀態:
2-3-1 Monitor On (-1): 設定螢幕為正常模式
2-3-2 Monitor Stanby (1):設定螢幕為省電模式 (只有使用LCD Port的螢幕才有效)
2-3-3 Monitor Off(2):設定螢幕為關閉模式
3、如何使用Windows API控制螢幕的亮度變化:
3-1、只有LCD port的螢幕可以進行亮度的控制,目前只有在Vista以上才可以進行設定。
3-2、主要使用下列二個Windows API:
一、CreateFile函式:建立或開啟File和I/O設備。
二、DeviceIoControl函式:傳送相關的指令給驅動程式。
3-3、 在C#中必須透過DllImport才能使用Widnows API的相關函數:
using System.Runtime.InteropServer;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(
[MarshalAs(UnmanagedType.LPStr)]
string strName,
uint nAccess,
uint nShareMode,
IntPtr lpSecurity,
uint nCreationFlags,
uint nAttributes,
IntPtr lpTemplate
);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool DeviceIoControl(
IntPtr hDevice,
uint dwIoControlCode,
byte[] lpInBuffer,
uint nInBufferSize,
[Out] byte[] lpOutBuffer,
uint nOutBufferSize,
out uint lpBytesReturned,
IntPtr lpOverlapped
);
3-4、控制螢幕亮度的相關的I/O Command有下列四個:
3-4-1、IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS:查詢螢幕支援的亮度設定
3-4-2、IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS:設定螢幕的亮度
3-4-3、IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS:
查詢目前螢幕的亮度設定 (只支援XP)
3-4-4、WmiMonitorBrightness Class:
查詢目前螢幕的亮度設定和支援的螢幕亮度(只支援Vista以上)
Download : Control Monitorl (Source Code) Control Monitor(EXE)
Result :