Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
Как можно определить количество подключенных мониторов?
22 апр 21, 11:03    [22312346]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 2190
Adilby,
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
MsgBox "Число мониторов в системе " & GetSystemMetrics(80)
22 апр 21, 14:10    [22312539]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7350
Adilby,
Именно в VBA?
22 апр 21, 14:29    [22312556]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 2190
sdku,

это и есть VBA
22 апр 21, 14:59    [22312579]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7350
ROI,
так я этого и не "вкуриваю"-зачем Аксу знать сколько мониторов подключено.
В панели управления графикой есть эти данные
22 апр 21, 16:07    [22312660]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
автор
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
MsgBox "Число мониторов в системе " & GetSystemMetrics(80)

Почему у меня красным выдает ошибку, что я должен подключить/сделать?
2 май 21, 13:48    [22317447]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
sdku,

к ноутбуку продавца подключаю дополнительный монитор, и через всплывающую форму показываю клиенту на втором мониторе что он покупает
2 май 21, 13:51    [22317449]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 2190
Adilby
автор
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
MsgBox "Число мониторов в системе " & GetSystemMetrics(80)

Почему у меня красным выдает ошибку, что я должен подключить/сделать?

Выделенное красным надо объявлять в отдельном модуле
2 май 21, 14:29    [22317471]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
ROI,

что-то не разобрался куда, что, как писать. Куда не пишу везде везде красным показывает. Не тыкнете ли, буду очень благодарен.
2 май 21, 15:04    [22317487]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5230
Adilby
автор
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
MsgBox "Число мониторов в системе " & GetSystemMetrics(80)

Почему у меня красным выдает ошибку, что я должен подключить/сделать?
#If VBA7 Then
Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#Else
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#End If
это пишется в разделе декларирования модуля, в данном случае формы...
2 май 21, 17:08    [22317554]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
vmag
Member

Откуда: MP
Сообщений: 4029
Панург,

PtrSafe обычно без (ByVal nIndex As LongPtr) не прокатывает.
3 май 21, 15:00    [22317836]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ЦЦа
Member

Откуда:
Сообщений: 73
vmag,

да с чего бы? Источник:
int GetSystemMetrics(
  int nIndex
);
int - это Long в VBA.
4 май 21, 13:32    [22318258]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
vmag
Member

Откуда: MP
Сообщений: 4029
ЦЦа,

Да я тут как-то делал на медни приложение с двумя accde под win 32 и win 64 так вот оказалось, что VBA шный As Long в конце это да - аналог int (для w64), а вот Long в параметре без Ptr вызывает ошибку передаваемого параметра... ноги от сюда растут

Сообщение было отредактировано: 4 май 21, 13:53
4 май 21, 13:53    [22318270]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ЦЦа
Member

Откуда:
Сообщений: 73
vmag,

"конец" или "начало" - не имеет значения. Без конкретики нельзя сказать, какая ошибка в выборе типов была допущена.
4 май 21, 14:13    [22318289]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
vmag
Member

Откуда: MP
Сообщений: 4029
ЦЦа,
vmag
PtrSafe обычно без (ByVal nIndex As LongPtr) не прокатывает.


В примере с мониторами на 64 разряда работает и Long и LongPtr
Могу своё "обычно" поменять на иногда и добавить, что LongPtr работает всегда...

К сообщению приложен файл (monitor.zip - 20Kb) cкачать
4 май 21, 15:03    [22318315]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7350
Adilby
к ноутбуку продавца подключаю дополнительный монитор, и через всплывающую форму показываю клиенту на втором мониторе что он покупает
В силу своей тупости ничё не понимаю:ну получите Вы цифру 1(или 2) и чё? Занахрена она клиенту? А просто словами объяснить (продемонстрировав возможности рядом тестов или без этого) клиенту что он покупает-не вариант

Сообщение было отредактировано: 4 май 21, 15:55
4 май 21, 16:02    [22318349]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ЦЦа
Member

Откуда:
Сообщений: 73
vmag
Могу своё "обычно" поменять на иногда и добавить, что LongPtr работает всегда...
От этого пахнет мистикой и вероятностным процессом, в то время как процесс выбора типа при преобразовании 32-битных приложений в 64-битные логичен и детерминирован (читай - при достаточной практике туп и механистичен).
И кстати, если не хочеЦЦа им заморачиваЦЦа - находим уже адаптированные под VBA7 описания функций (Declare или библиотеки типов (.tlb)). А если таки хочеЦЦа - можно начать с официального источника и ссылок из него.
4 май 21, 16:08    [22318360]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 797
vmag,
поиск через CTRL-F
а вообще знать количество подключенных мониторов это довольно важно - либо на 1 моник инфу выводить, либо на два, или 3. К примеру расположили формы на 2 монитора , а у юзера он только 1 - окна все равно будут на втором мониторе - они на 1 монитор не соберутся и юзер будет считать что их нет (он их на 1-м мониторе не видит), а разработчик - что они есть (он их видит на 2-м мониторе куда сам и засунул)!
4 май 21, 21:20    [22318499]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
vmag
Member

Откуда: MP
Сообщений: 4029
alecko
а вообще знать количество подключенных мониторов это довольно важно

наверно, правда за 30 лет ни разу даже в голову такое не пришло, ток щас узнал, что есть такая возможность...
а уж кому это совсем по барабану (что там на этом мониторе и включен ли он вообще) - так это кассиру, чеки вылазят и ладно... последние метра три чековой ленты
идут с красной полосой, намекая что ленту пора заменить дабы кассу не заклинило на середине чека, так они даже это умудряются прозевать, отдают клиенту крашеный чек молча и ноль эмоций...
Да и мне как покупателю, не хотелось бы чтоб весь магазин видел что я покупаю и на какую сумму, я бы нажал кнопочку и отключил монитор когда подойдет моя очередь...
:-)

Сообщение было отредактировано: 4 май 21, 22:24
4 май 21, 22:24    [22318534]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
old_joy
Member

Откуда:
Сообщений: 187
Было бы еще интересно получить и разрешение мониторов.
5 май 21, 06:23    [22318589]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
Панург
Adilby
пропущено...

Почему у меня красным выдает ошибку, что я должен подключить/сделать?
#If VBA7 Then
Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#Else
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#End If
это пишется в разделе декларирования модуля, в данном случае формы...


Отлично! Спасибо!
5 май 21, 13:53    [22318765]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
sdku
Adilby
к ноутбуку продавца подключаю дополнительный монитор, и через всплывающую форму показываю клиенту на втором мониторе что он покупает
В силу своей тупости ничё не понимаю:ну получите Вы цифру 1(или 2) и чё? Занахрена она клиенту? А просто словами объяснить (продемонстрировав возможности рядом тестов или без этого) клиенту что он покупает-не вариант


это было продолжение этого процесса https://www.sql.ru/forum/1160340/customer-display-displey-pokuratelya
5 май 21, 14:26    [22318786]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
[quot vmag#22318534]
alecko
...
Да и мне как покупателю, не хотелось бы чтоб весь магазин видел что я покупаю и на какую сумму, я бы нажал кнопочку и отключил монитор когда подойдет моя очередь...
:-)

)))))
некоторые покупатели не доверяют кассиру и хотят видеть что там мутится))
5 май 21, 14:30    [22318788]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
Adilby
Member

Откуда:
Сообщений: 23
А теперь можно ли командно открыть всплывающую форму именно на втором мониторе?
5 май 21, 14:32    [22318789]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 797
Adilby,
docmd.MoveSize 
5 май 21, 15:19    [22318840]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
vmag
Member

Откуда: MP
Сообщений: 4029
Adilby
некоторые покупатели не доверяют кассиру и хотят видеть что там мутится))

Да ерунда всё это, тот кто не доверяет смотрит потом в чек...
Ну... так ... немного престижа, но в основном понты...
Зато:
ноут + монитор... заманчиво... прикручивайте всё шурупами к столу намертво или на эпоксидку...
типичная ситуация:
- ноут на прилавке (а тут еще и монитор)
- клиент говорит кассиру: а покажите ка вон тот набор отверток вверху на стеллаже...
- продавец берет табуреточку, тянется за отвертками и слышит звон колокольчика на двери - Бздынь...
- оборачивается - ни клиента... ни ноутбука...

Если уж ставить монитор, то крутить на нем клипы с красивыми формами, чтоб мужикам на кассе в авоську
просрочку докладывать...

p/c/ реально за мою практику ушло 6 ноутов у клиентов
5 май 21, 16:05    [22318876]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
old_joy
Member

Откуда:
Сообщений: 187
Adilby,

MoveWindow
6 май 21, 07:18    [22319093]     Ответить | Цитировать Сообщить модератору
 Re: Определить количество подключенных мониторов  [new]
ЦЦа
Member

Откуда:
Сообщений: 73
Adilby
А теперь можно ли командно открыть всплывающую форму именно на втором мониторе?
old_joy
Было бы еще интересно получить и разрешение мониторов.
+
Класс MonitorEnumProcData:
Option Explicit

Public Left As Long
Public Top As Long
Public Right As Long
Public Bottom As Long
Public PelsWidth As Long
Public PelsHeight As Long
Public BitsPerPel As Long
Public DisplayFrequency As Long
Public MonitorFlags As MonitorInfoFlags
Public NextMon As MonitorEnumProcData 'ссылка на характеристики следующего монитора
Модуль:
Option Explicit

Private Enum BOOL
    FALSE_BOOL = 0&
    TRUE_BOOL = 1&
End Enum

#If VBA7 Then
Private Const NULL_PTR As LongPtr = 0
#Else
Private Const NULL_PTR As Long = 0
#End If

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

#If VBA7 Then
Private Declare PtrSafe Function EnumDisplayMonitors Lib "user32" ( _
    ByVal hDC As LongPtr, lprcClip As Any, ByVal lpfnEnum As LongPtr, _
    dwData As MonitorEnumProcData) As BOOL
#Else
Private Declare Function EnumDisplayMonitors Lib "user32" ( _
    ByVal hDC As Long, lprcClip As Any, ByVal lpfnEnum As Long, _
    dwData As MonitorEnumProcData) As BOOL
#End If

Public Enum MonitorInfoFlags
    MONITORINFOF_PRIMARY = 1&
End Enum

'  size of a device name string
Private Const CCHDEVICENAME = 32

Private Type DEVICE_NAMEW
    szName(0 To CCHDEVICENAME * 2 - 1) As Byte
End Type

Private Type MONITORINFOEXW
    cbSize As Long
    rcMonitor As RECT
    rcWork As RECT
    dwFlags As Long
    szDevice As DEVICE_NAMEW
End Type

#If VBA7 Then
Private Declare PtrSafe Function GetMonitorInfoW Lib "user32" ( _
    ByVal hMonitor As LongPtr, lpmi As Any) As BOOL
#Else
Private Declare Function GetMonitorInfoW Lib "user32" ( _
    ByVal hMonitor As Long, lpmi As Any) As BOOL
#End If

'  size of a form name string
Private Const CCHFORMNAME = 32

Private Type FORM_NAMEW
    szName(0 To CCHFORMNAME * 2 - 1) As Byte
End Type

Private Type DEVMODEW
    dmDeviceName As DEVICE_NAMEW
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As FORM_NAMEW
    dmUnusedPadding As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
'#if(WINVER >= 0x0400)
    dmICMMethod As Long
    dmICMIntent As Long
    dmMediaType As Long
    dmDitherType As Long
    dmReserved1 As Long
    dmReserved2 As Long
'  #if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
    dwPanningWidth As Long
    dwPanningHeight As Long
'  #endif
'#endif /* WINVER >= 0x0400 */
End Type

Private Const ENUM_CURRENT_SETTINGS As Long = -1
Private Const ENUM_REGISTRY_SETTINGS As Long = -2

Private Enum EnumDisplaySettingsFlags
    EDS_DEFAULT = &H0&
    EDS_RAWMODE = &H2&
    EDS_ROTATEDMODE = &H4&
End Enum

#If VBA7 Then
Private Declare PtrSafe Function EnumDisplaySettingsExW Lib "user32" ( _
    lpszDeviceName As Any, ByVal iModeNum As Long, lpDevMode As DEVMODEW, _
    Optional ByVal dwFlags As EnumDisplaySettingsFlags = EDS_DEFAULT) As BOOL
#Else
Private Declare Function EnumDisplaySettingsExW Lib "user32" ( _
    lpszDeviceName As Any, ByVal iModeNum As Long, lpDevMode As DEVMODEW, _
    Optional ByVal dwFlags As EnumDisplaySettingsFlags = EDS_DEFAULT) As BOOL
#End If

#If VBA7 Then
Private Declare PtrSafe Function MoveWindow Lib "user32" ( _
    ByVal hWnd As LongPtr, ByVal X As Long, ByVal Y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, _
    ByVal bRepaint As BOOL) As BOOL
Private Declare PtrSafe Function GetWindowRect Lib "user32" ( _
    ByVal hWnd As LongPtr, lpRect As RECT) As BOOL
#Else
Private Declare Function MoveWindow Lib "user32" ( _
    ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, _
    ByVal bRepaint As BOOL) As BOOL
Private Declare Function GetWindowRect Lib "user32" ( _
    ByVal hWnd As Long, lpRect As RECT) As BOOL
#End If

#If VBA7 Then
Private Function MonitorEnumProc(ByVal hMonitor As LongPtr, _
                                 ByVal hDC As LongPtr, rcBounds As RECT, _
                                 Data As MonitorEnumProcData) As BOOL
#Else
Private Function MonitorEnumProc(ByVal hMonitor As Long, _
                                 ByVal hDC As Long, rcBounds As RECT, _
                                 Data As MonitorEnumProcData) As BOOL
#End If
    Dim ThisData As MonitorEnumProcData
    Set ThisData = New MonitorEnumProcData
    ThisData.Left = rcBounds.Left
    ThisData.Top = rcBounds.Top
    ThisData.Right = rcBounds.Right
    ThisData.Bottom = rcBounds.Bottom
    
    Dim bResult As BOOL
    Dim mi As MONITORINFOEXW
    mi.cbSize = LenB(mi)
    bResult = GetMonitorInfoW(hMonitor, mi)
    If bResult = FALSE_BOOL Then MonitorEnumProc = FALSE_BOOL: Exit Function
    ThisData.MonitorFlags = mi.dwFlags
    
    Dim dm As DEVMODEW
    dm.dmSize = LenB(dm)
    bResult = EnumDisplaySettingsExW(mi.szDevice, ENUM_CURRENT_SETTINGS, dm)
    If bResult <> FALSE_BOOL Then
        ThisData.PelsWidth = dm.dmPelsWidth
        ThisData.PelsHeight = dm.dmPelsHeight
        ThisData.BitsPerPel = dm.dmBitsPerPel
        ThisData.DisplayFrequency = dm.dmDisplayFrequency
    End If
    
    'Составляем односвязный список мониторов с характеристиками
    If Data Is Nothing Then
        Set Data = ThisData
    Else
        Dim CurrData As MonitorEnumProcData
        Set CurrData = Data
        Do Until CurrData.NextMon Is Nothing
           Set CurrData = CurrData.NextMon
        Loop
        Set CurrData.NextMon = ThisData
    End If
    
    MonitorEnumProc = TRUE_BOOL
End Function

#If VBA7 Then
Private Function MoveWindowToSecondMonitor( _
    ByVal hWnd As LongPtr, _
    Optional ByVal X As Long, Optional ByVal Y As Long) As Boolean
#Else
Private Function MoveWindowToSecondMonitor( _
    ByVal hWnd As Long, _
    Optional ByVal X As Long, Optional ByVal Y As Long) As Boolean
#End If
    Dim Data As MonitorEnumProcData
    Dim bResult As BOOL
    bResult = EnumDisplayMonitors(NULL_PTR, ByVal NULL_PTR, _
                                  AddressOf MonitorEnumProc, Data)
    
    If Data Is Nothing Then Exit Function
    If Data.NextMon Is Nothing Then Exit Function 'выходим, если нет второго монитора
    
    Dim rcWnd As RECT
    bResult = GetWindowRect(hWnd, rcWnd)
    With Data.NextMon
        bResult = MoveWindow(hWnd, .Left + X, .Top + Y, _
                             rcWnd.Right - rcWnd.Left, _
                             rcWnd.Bottom - rcWnd.Top, _
                             TRUE_BOOL)
    End With
    MoveWindowToSecondMonitor = bResult <> FALSE_BOOL
End Function

Public Sub RunMe() 'Тестовая процедура - разместить активную (всплывающую) форму на втором мониторе
    MoveWindowToSecondMonitor Screen.ActiveForm.hWnd, 200, 100
End Sub
13 май 21, 19:49    [22321817]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft Access Ответить