首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在双显示器系统中,找出在哪个显示器上显示PowerPoint幻灯片

在双显示器系统中,找出在哪个显示器上显示PowerPoint幻灯片
EN

Stack Overflow用户
提问于 2011-08-30 00:48:38
回答 3查看 11.8K关注 0票数 2

在PowerPoint2007/2010运行在多显示器系统上,我们可以通过转到“幻灯片放映”->“设置slideShow”-> "Display slideshow on“并选择所需的显示器来选择将在其上显示幻灯片的显示器。

是否可以通过编程方式确定这些设置(例如,使用VBA)?

我真正需要的是放映幻灯片的显示器的像素分辨率。我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-30 11:21:41

试试这个:

代码语言:javascript
复制
With SlideShowWindows(1)
Debug.Print .Height
Debug.Print .Width
End With

这将为您提供积分结果。每英寸有72个点,所以:

ResultInPixels = (ResultInPoints * WindowsDPI) / 72

通常情况下,WindowsDPI是96,但你不能依赖它。对GetSystemMetrics的API调用将为您提供当前值。

票数 2
EN

Stack Overflow用户

发布于 2011-08-30 17:17:57

即使你已经接受了史蒂夫的回答。下面是一些有用的代码片段。

您可以使用这种代码(找到here)获取有关系统监视器的信息:

代码语言:javascript
复制
Attribute VB_Name = "MonitorInfo"
Option Explicit

Public Declare Function LoadLibraryEx Lib "kernel32.dll" Alias "LoadLibraryExA" (ByVal lpFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
Public Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Public Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Boolean
Public Declare Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As Long, ByVal dwData As Long) As Boolean
Public Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFOEX) As Boolean

Public Const CCHDEVICENAME = 32
Public Const MONITORINFOF_PRIMARY = &H1

Public Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Public Type MONITORINFOEX
    cbSize As Long
    rcMonitor As RECT
    rcWork As RECT
    dwFlags As Long
    szDevice As String * CCHDEVICENAME
End Type

Dim MonitorId() As String

Public Sub Test()
Dim i As Integer
    Debug.Print "Number of monitors in this system : " & GetMonitorId
    Debug.Print
    For i = 1 To UBound(MonitorId)
        PrintMonitorInfo (MonitorId(i))
    Next i
End Sub

Public Function GetMonitorId()
    ReDim MonitorId(0)
    ' Of course dual screen systems are not available on all Win versions.
    If FunctionExist("user32.dll", "EnumDisplayMonitors") = True Then
        If EnumDisplayMonitors(&H0, ByVal &H0, AddressOf MonitorEnumProc, &H0) = False Then
            Failed "EnumDisplayMonitors"
        End If
    End If
    GetMonitorId = UBound(MonitorId)
End Function


Private Sub PrintMonitorInfo(ForMonitorID As String)
Dim MONITORINFOEX As MONITORINFOEX
    MONITORINFOEX.cbSize = Len(MONITORINFOEX)
    If GetMonitorInfo(CLng(ForMonitorID), MONITORINFOEX) = False Then Failed "GetMonitorInfo"
    With MONITORINFOEX
        Debug.Print "Monitor info for device number : " & ForMonitorID
        Debug.Print "---------------------------------------------------"
        Debug.Print "Device Name : " & .szDevice
        If .dwFlags And MONITORINFOF_PRIMARY Then Debug.Print "Primary Display = True" Else Debug.Print "Primary Display = False"
        With .rcMonitor
            Debug.Print "Monitor Left : " & .Left
            Debug.Print "Monitor Top : " & .Top
            Debug.Print "Monitor Right : " & .Right
            Debug.Print "Monitor Bottom : " & .Bottom
        End With
        With .rcWork
            Debug.Print "Work area Left : " & .Left
            Debug.Print "Work area Top : " & .Top
            Debug.Print "Work area Right : " & .Right
            Debug.Print "Work area Bottom : " & .Bottom
        End With
    End With
    Debug.Print
    Debug.Print
End Sub


Public Function FunctionExist(ByVal strModule As String, ByVal strFunction As String) As Boolean
Dim hHandle As Long
    hHandle = GetModuleHandle(strModule)
    If hHandle = &H0 Then
        Failed "GetModuleHandle"
        hHandle = LoadLibraryEx(strModule, &H0, &H0): If hHandle = &H0 Then Failed "LoadLibrary"
        If GetProcAddress(hHandle, strFunction) = &H0 Then
            Failed "GetProcAddress"
        Else
            FunctionExist = True
        End If
        If FreeLibrary(hHandle) = False Then Failed "FreeLibrary"
    Else
        If GetProcAddress(hHandle, strFunction) = &H0 Then
            Failed "GetProcAddress"
        Else
            FunctionExist = True
        End If
    End If
End Function


Public Sub Failed(ByVal strFunction As String)
    If errMsg = True Then
        If Err.LastDllError = 0 Then
            MessageBoxEx &H0, strFunction & Chr$(13) & Chr$(10) & Chr$(13) & Chr$(10) & "Failed", "Error", MB_OK Or MB_ICONWARNING Or MB_SETFOREGROUND, 0
        Else
            Errors Err.LastDllError, strFunction
        End If
    End If
End Sub


Public Function MonitorEnumProc(ByVal hMonitor As Long, ByVal hdcMonitor As Long, ByRef lprcMonitor As RECT, ByVal dwData As Long) As Boolean
Dim ub As Integer
    ub = 0
    On Error Resume Next
    ub = UBound(MonitorId)
    On Error GoTo 0
    ReDim Preserve MonitorId(ub + 1)
    MonitorId(UBound(MonitorId)) = CStr(hMonitor)
    MonitorEnumProc = 1
End Function

并将结果与当前的SlideShowWindows(1)结果进行比较。

票数 8
EN

Stack Overflow用户

发布于 2015-04-06 21:24:27

Edwin Vermeer的代码@JMax真的很棒。我确信我会被mods搞得一塌糊涂,但我制作了下面的图表,以显示代码中的Sub test()到底返回了什么。希望这能节省一两个小时的n00b。

提示:查找-将Dubug.Print替换为MsgBox,并使用不同的监视器排列多次运行代码,以确保您理解返回的内容。

下面是一个奇怪的监视器排列,它很好地展示了你将获得的不同回报:

...well它不会让我发布照片,直到我有10个声誉,图表在这里:

"Monitor" returns for Primary monitor

"Work area" returns for Primary monitor

辅助显示器返回" monitor /Work“

(在同一相册中作为其他2,需要10个声誉张贴>2个链接...)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7233153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档