kn007 发表于 2011-3-14 21:10:20

请教下,有没有切换显示器(即监视器)的方法,并且设置为延伸或复制?

请教下,有没有切换显示器(即监视器)的方法,并且设置为延伸或复制?
延伸暂时想到了系统的显示属性,觉得应该有api
复制(即双或多显示屏显示同一内容)应该也有api,不然的话就只能在显卡工具(如intel driver找)。。。

问问看,有人知道不?

毕竟经常用到。。。

3mile 发表于 2011-3-14 21:30:10

查了一下,有相关的API.
但我没有多显示器,只能提供点相关的资料.系统支持编程开发的API

  Microsoft为支持多显示器模式提供了一些新的API调用,下面具体介绍它们的功能:

  1.HMONITOR MonitorFromPoint(POINT pt,DWORD dwFlags)

  MonitorFromPoint返回包含特定点(pt)的一个显示器句柄。如果pt不属于任何一个显示器,返回的显示器句柄由dwFlags标志决定:MONITOR_DEFAULTTONULL时返回 NULL,MONITOR_DEFAULTTOPRIMARY时返回代表主显示器的HMONITOR句柄,MONITOR_DEFAULTTONEAREST时返回最靠近pt点的显示器的HMONITOR句柄。 2.HMONITOR MonitorFromRect(LPCRECT lprc,DWORD dwFlags)

  MonitorFromRect返回包含lprc代表的矩形的显示器句柄;如果包含此矩形的显示区域不止一个,则返回包含矩形最大部分的显示器句柄;如果矩形不属于任何一个显示区域,返回的句柄由dwFlags决定,规则与MonitorFromPoint相同。

  3. HMONITOR MonitorFromWindow(HWND hwnd,DWORD dwFlags)

  与MonitorFromRect类似,但输入是一个代表窗口的句柄hwnd而不是指向矩形的指针。

  4. BOOL GetMonitorInfo(HMONITOR hMonitor,LPMONITORINFO lpmi)

  GetMonitorInfo返回由hMonitor代表的显示器的有关信息,这些信息存储在指向MONITORINFO结构的指针——lpmi中。这些信息包括用RECT结构表示的显示器的显示区域的大小(如果这个显示器不是主显示器,RECT的坐标可能为负数),以及用RECT结构表示的显示器的工作区域的大小,工作区域是显示区域中除去系统任务栏和应用程序快捷方式栏所剩下的区域,还能够判断此显示器是否为主显示器,并返回一个标志。

  5.BOOL EnumDisplayMonitors(HDC hdc,LPCRECT lprcClip,MONITORENUMPROC lpfnEnum,LPARAM dwData)

  hdc是一个代表显示设备环境的句柄,lprcClip是指向一个矩形区域的指针。把这个矩形区域和设备环境中的可见区域取交集,得到的区域可能分布在多个显示器的显示区域中,EnumDisplayMonitors对每一个包含交集的显示区域调用一次MonitorEnumProc类型的函数。DwData为传递给MonitorEnumProc函数的数据。

  6.BOOL CALLBACK MonitorEnumProc(HMONITOR hmonitor,HDC hdcMonitor,LPRC lprcMonitor, DWORD dwData)

  MonitorEnumProc是一个被EnumDisplayMonitors函数调用的回调函数,它的内容可以由用户自定义。利用这两个函数,用户在进行跨多个显示器的显示时就可以利用每一个显示器的不同的显示特性。

  当然,并不是所有画图程序都必须调用这两个函数,这时你假设所有的显示器都使用同样颜色的分辨率。

  7.EnumDisplayDevices(LPVOID lpReserved,int iDeviceNum,DISPLAY_DEVICE×pDisplayDevice,DWORD dwFlags)

  EnumDisplayDevices列出系统中某个显示设备(以iDeviceNum为序号)的信息。与GetMonitorInfo相比,GetMonitorInfo对应的显示器必须是Windows虚拟桌面的一部分,而 EnumDisplayDevices可以列出包括处于独立显示模式下的系统所安装的所有显示器的信息。它返回的信息储存在DISPLAY_DEVICE 结构中,包括显示设备名称、对显示设备的描述和显示设备的状态。

  此外,一些原有的API调用如SystemParametersInfo和 GetSystemMetrics也加入了对多显示器模式的支持。比如调用GetSystemMetrics时,如果用 SM_XVIRTUALSCREEN、SM_YVIRTUALSCREEN、SM_CXVIRTUALSCREEN和 SM_CYVIRTUALSCREEN,得到的是虚拟桌面左上角的坐标和整个的长度和宽度。

  我们在编程时特别要注意坐标的变化:首先单显示器下负坐标或大于SM_CXSCREEN和 SM_CYSCREEN部分的窗口将被隐藏,而在多显示器模式下这些都是合法的。其次在确定应用程序窗口和对话框的位置时,要选择正确的显示器和正确的全局坐标(虚拟桌面坐标)。最后,在恢复原来存储的窗口之前,要检查一下这些窗口坐标的有效性。

   这些都可以在微软的MSDN上去查出来,需要仔细的看一看,每个API都亲自试一试.

kn007 发表于 2011-3-15 12:32:34

查了一下,有相关的API.
但我没有多显示器,只能提供点相关的资料.
3mile 发表于 2011-3-14 21:30 http://www.autoitx.com/images/common/back.gif


    很感谢,去试试

haodd 发表于 2011-4-4 19:37:55

回复 3# kn007
    api 搞定了吗?

我这里建议 模拟的方法

这个是我今天去调试双屏 设置主显切换的,是延伸的两个显示器 进行主屏切换
这个 跟你帖子的主题不是很贴切

你是要切换 复制和延伸的方法

暂把代码放在你这里吧

以后搜索方便 呵呵


Run("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3","",@SW_HIDE)
Sleep(800)
WinActivate("显示 属性","设置")
$MonitorNum=ControlGetText("显示 属性","设置", "")
If StringLeft($MonitorNum,1) = "1" Then
        $MonitorNum = ControlSend ("显示 属性","设置", "", "2")
Else
        $MonitorNum = ControlSend ("显示 属性","设置", "", "1")
EndIf
ControlClick("显示 属性","设置","")
ControlClick("显示 属性","设置","")
ControlClick("显示 属性","设置","")
Exit

boyhong 发表于 2011-4-5 12:38:20

期待API的答案。
页: [1]
查看完整版本: 请教下,有没有切换显示器(即监视器)的方法,并且设置为延伸或复制?