Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
kokett1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 4
1

Как определить на каком мониторе находится сторонняя программа?

22.07.2018, 17:33. Просмотров 793. Ответов 7
Метки нет (Все метки)

Привет всем, как определить на каком мониторе находится сторонняя программа, к примеру блокнот или калькулятор?

Я попробовал сначала определить хандл процесса, а потом по размеру окна подбирать мониторы. Загвоздка происходит если два окна имеют одинаковый размер, тогда программа просто не реагирует.

Может кто сможет помочь или знает более красивый подход к этому вопросу, буду очень благодарен.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Imports System.Runtime.InteropServices
 
Public Class Form1
 
    Public Structure RECT
        Dim Left As Integer
        Dim Top As Integer
        Dim Right As Integer
        Dim Bottom As Integer
    End Structure
 
    <DllImport("user32.dll")>
    Private Shared Function GetWindowRect(ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Boolean
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
Dim pro As Process
 
        For Each pro In Process.GetProcesses
 
            If pro.ProcessName = "notepad" Then
 
                Dim hWnd As IntPtr = pro.MainWindowHandle
                Dim XYRect As RECT
                GetWindowRect(hWnd, XYRect)
 
                For i = 0 To Screen.AllScreens.Length - 1
                    Dim r As Rectangle = Screen.AllScreens(i).Bounds
 
                    If r.Contains(New Point(XYRect.Left, XYRect.Top)) Then
                        MessageBox.Show("Notepad is on Screen " & (i + 1), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
 
                Next
            End If
        Next
 
    End Sub
End Class
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2018, 17:33
Ответы с готовыми решениями:

Проверить открыта ли сторонняя программа
Здравствуйте, подскажите как можно проверить открыта (включена) ли сторонняя...

Как получить скрин именно окна другой программы, а не всего, того что находится на мониторе
Как получить скрин именно окна другой программы а не всего того что находиться...

Как определить на каком языке написан файл?
У меня есть .ехе файл, работает с интернетом. Есть какие нибудь способы...

Как определить, было ли событие в каком-либо компоненте?
Мне нужно определить было ли событие или нет? Например, меняли ли дату в...

Как определить, в каком из динамически созданных UserControl возникло событие
Есть UserControl с Event`ом, результатом работы которого является текст. Этот...

7
ovva
2396 / 2028 / 498
Регистрация: 02.02.2013
Сообщений: 1,888
Записей в блоге: 2
22.07.2018, 19:43 2
Попробуйте так
vb.net
1
2
3
Dim procs() As Process = Process.GetProcessesByName("Notepad")
Dim hWnd As IntPtr = procs(0).MainWindowHandle
Dim sc As Screen = Screen.FromHandle(hWnd)
0
kokett1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 4
22.07.2018, 21:06  [ТС] 3
ну основываясь на том что вы предложили приходит только одно в голову, а именно считать имя монитора \\.\DISPLAY X,затем удалить всё кроме порядкового номера монитора X.

Вы этот способ имели ввиду?
И вот ещё какой вопрос, будет ли в каких либо случиях имя монитора выдаваться не как \\.\DISPLAY X, а к примеру как Samsung ....

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Dim pro() As Process = Process.GetProcessesByName("notepad")
 
        Dim hWnd As IntPtr = pro(0).MainWindowHandle
        Dim sc As Screen = Screen.FromHandle(hWnd)
 
        Dim MonitorName As String = sc.DeviceName.ToString
        Dim done As String = MonitorName.Substring(11)
 
        MsgBox(done)
 
    End Sub
End Class
0
ovva
2396 / 2028 / 498
Регистрация: 02.02.2013
Сообщений: 1,888
Записей в блоге: 2
23.07.2018, 00:37 4
Лучший ответ Сообщение было отмечено kokett1 как решение

Решение

Я полагал, что выбрать номер не составит труда (а именно он определялся в вашем коде)
vb.net
1
2
Dim nm As String = sc.DeviceName
MsgBox(nm.Substring(nm.Length - 1, 1))
будет ли в каких либо случиях имя монитора выдаваться не как \\.\DISPLAY X, а к примеру как Samsung ....
Определенно сказать не могу. Думаю, что если при установке дисплея можно указать имя, то оно и будет прочитано.

Добавлено через 2 часа 51 минуту
Для извлечения имени попробуйте следующий код
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Imports System.Management 'не забудьте подключить ссылку
'…
MsgBox(getMonitorName(num))
'…
Public Function getMonitorName(ByVal nn As Integer) As String
    Try
        Dim nms As New List(Of String)
        Dim searcher As New ManagementObjectSearcher("root\WMI", "SELECT * FROM WmiMonitorID")
'для получения имени производителя заменить UserFriendlyName на ManufacturerName
        For Each queryObj As ManagementObject In searcher.Get()
            If queryObj("UserFriendlyName") Is Nothing Then
                nms.Add("")
            Else
                Dim s As String = ""
                Dim arrUserFriendlyName As UInt16()
                arrUserFriendlyName = queryObj("UserFriendlyName")
                For Each arrValue As UInt16 In arrUserFriendlyName
                    s &= ChrW(arrValue)
                Next
                nms.Add(s)
            End If
        Next
        Return nms(nn - 1)
    Catch err As ManagementException
        MsgBox(err.Message)
        Return ""
    End Try
End Function
1
kokett1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 4
23.07.2018, 18:01  [ТС] 5
Ооооо, огромное спасибо, мне также было интересно узнать как можно извлечь имя. Вот написал код, подключил референции (System.Management) как вы и сказали, но что-то Function getMonitorName не отдаёт мне значение Return. Где-то протупил...


vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Imports System.Management
 
Public Class Form1
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Dim pro() As Process = Process.GetProcessesByName("notepad")
 
        Dim hWnd As IntPtr = pro(0).MainWindowHandle
        Dim sc As Screen = Screen.FromHandle(hWnd)
 
        Dim nm As String = sc.DeviceName
        MessageBox.Show(nm.Substring(nm.Length - 1, 1))
 
        MessageBox.Show(getMonitorName())
 
    End Sub
 
 
    Public Function getMonitorName(ByVal nn As Integer) As String
        Try
            Dim nms As New List(Of String)
            Dim searcher As New ManagementObjectSearcher("root\WMI", "SELECT * FROM WmiMonitorID")
 
            'для получения имени производителя заменить UserFriendlyName на ManufacturerName
            For Each queryObj As ManagementObject In searcher.Get()
                If queryObj("UserFriendlyName") Is Nothing Then
                    nms.Add("")
                Else
                    Dim s As String = ""
                    Dim arrUserFriendlyName As UInt16()
                    arrUserFriendlyName = queryObj("UserFriendlyName")
                    For Each arrValue As UInt16 In arrUserFriendlyName
                        s &= ChrW(arrValue)
                    Next
                    nms.Add(s)
                End If
            Next
            Return nms(nn - 1)
            MsgBox(nms)
        Catch err As ManagementException
            MsgBox(err.Message)
            Return ""
        End Try
    End Function
 
End Class
0
ovva
2396 / 2028 / 498
Регистрация: 02.02.2013
Сообщений: 1,888
Записей в блоге: 2
23.07.2018, 18:51 6
В getMonitorName в качестве параметра должен передаваться номер монитора
vb.net
1
2
3
4
Dim nm As String = sc.DeviceName
Dim n As Integer = CInt(nm.Substring(nm.Length - 1, 1))
MessageBox.Show(n)
MessageBox.Show(getMonitorName(n))
PS. Не знаю как с именем, но вот производитель точно должен присутствовать.
0
kokett1
0 / 0 / 0
Регистрация: 22.07.2018
Сообщений: 4
24.07.2018, 00:21  [ТС] 7
снимаю шляпу перед вами, вы очень помогли

у меня старый мониторчик SyncMaster 701N от Samsung и выходят следующие данные:

UserFriendlyName отдаёт: SyncMaster без 701N
ManufacturerName отдаёт: SAM что давольно странно
0
Orlangur1991
24.07.2018, 08:29     Как определить на каком мониторе находится сторонняя программа?
  #8

Не по теме:

kokett1, SAM себе монитор :D

0
24.07.2018, 08:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2018, 08:29
Привет! Вот еще темы с ответами:

Определить в каком подъезде и на каком этаже находится квартира с заданным номером K
Ребят, помогите плз, 3 теста не проходит. Не понимаю, в чём дело. Вот мой...

Как определить в каком контроле находится курсор?
Юзер нажал клавишу, как определить в каком контроле это сделано?

Как определить, на каком из компонентов DBGridEh находится мышь?
есть не сколько DBGridEh как определить на каком из них находится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru