Как определить координаты рабочих столов…

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Как определить координаты рабочих столов…

Сообщение Antonariy » 28.10.2009 (Ср) 14:15

…в многодисплейной конфигурации?
Лучший способ понять что-то самому — объяснить это другому.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как определить координаты рабочих столов…

Сообщение Nord777 » 28.10.2009 (Ср) 16:57

EnumDisplayMonitors
GetMonitorInfo
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как определить координаты рабочих столов…

Сообщение Antonariy » 29.10.2009 (Чт) 11:59

Что-то очень странное творится с EnumDisplayMonitors.
Код: Выделить всё
Option Explicit
Public Declare Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As Long, ByVal dwData As Long) As Long
Public Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFO) As Long

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

Public Type MONITORINFO
    cbSize As Long
    rcMonitor As RECT
    rcWork As RECT
    dwFlags As Long
End Type

Public MinLeft As Long
Public MaxRight As Long
Dim FullWidth As Long

Sub main()
Dim rc As RECT
    Debug.Print EnumDisplayMonitors(0, 0, AddressOf MonitorEnumProc, 0)
    FullWidth = Abs(MinLeft) + MaxRight
End Sub

Public Function MonitorEnumProc(ByVal hMonitor As Long, ByVal hdcMonitor As Long, lprcMonitor As RECT, ByVal dwData As Long) As Long
    Dim MI As MONITORINFO
    MI.cbSize = Len(MI)
    GetMonitorInfo hMonitor, MI
    With MI.rcWork
        If .Left < MinLeft Then MinLeft = .Left
        If .Right > MaxRight Then MaxRight = .Right
    End With
    MonitorEnumProc = 1
End Function
Сначала это работало, а в один прекрасный момент MonitorEnumProc перестала отрабатываться, хотя EnumDisplayMonitors возвращает единичку. Пробовал и мониторы переключать и комп перезагружать — не работает.

Еще попробовал вместо AddressOf передать число от балды, тоже единичка возвращается.

UPD: Оказывается все нули с ByVal должны быть.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList