Como verificar em tempo de execução, qual monitor estou usando, se estou usando o monitor 1 ou o monitor 2?

Gostaria de um auxílio em como detectar os monitores da aplicação, para identificar qual monitor estou utilizando?
Set Monitor = GetObject(“Winmgmts:\.\root\cimv2:Win32_DesktopMonitor=‘DesktopMonitor1’”)
parWidth = Monitor.ScreenWidth
parHeight = Monitor.ScreenHeight

Acho que deve ser algo meio parecido com esse que detecta a resolução da tela.

Deve ser uma outra função do windows, mas não consegui encontrar como saber se estou usando o monitor 1 ou monitor 2.

@Rudimar, bom dia.

Como observado, acredito que uma das formas de fazer isto seria utilizando a resolução do monitor mesmo, mas precisaria de um evento que checasse a posição após a abertura da tela.

Como sugestão, pode-se fazer da seguinte forma:

  • Criar um evento do usuário com a propriedade MouseOverChild da tela (ou de um objeto de tela);

  • Inserir o seguinte script:

    Sub TelaInicial_UserEventMouseOver()

    If Application.GetMouseX() <= 1440 then
    MsgBox “Monitor 1”
    ElseIf Application.GetMouseX() > 1440 then
    MsgBox “Monitor 2”
    Else
    MsgBox “Indeterminado”
    End If

    End Sub

Desta forma, ao passar o Mouse sobre a tela, dependendo da posição do mesmo, irá indicar em qual monitor está.

Obs.: Se achar melhor, utilizar o evento click ou outro.

Sds.

Já precisei verificar se estava no monitor principal ou não, ou seja em aplicações com mais de 2 monitores ainda tenho somente o retorno de TRUE p/ monitor principal e FALSE p/ quaisquer outros monitores. Para isso criei um executável em c++.

#include "wtypes.h"

BOOL main() 
{
  HMONITOR monitor = MonitorFromWindow( GetForegroundWindow(), 
      MONITOR_DEFAULTTONEAREST );
  MONITORINFO info;
  info.cbSize = sizeof( MONITORINFO );
  GetMonitorInfo( monitor, (LPMONITORINFO) &info );
  return (BOOL) info.dwFlags;
}

No Elipse:

Sub button_Click()
	Dim return
	Dim objShell : Set objShell = CreateObject("WScript.Shell")

	' Caminho p/ o executavel.
	return = objShell.Run("c:\is_main_monitor.exe", 0, True)
	
	If ( CBool(return) ) Then
		' Monitor principal.
	Else
		' Monitor NAO principal.
	End If
End Sub

Link p/ download do .exe: https://goo.gl/zy3cVh

* Não testado em aplicações com mais de 2 monitores.
** Se sua aplicação no Elipse rodar “janelada” ou vc executar o código através de uma popup que esteja ocupando as áreas de duas telas, o retorno será do monitor onde estiver contida a maior área da janela.

6 Likes

Obrigado @Fernando, Irei testar para ver como se comporta.

Obrigado @leandrobpedro , Irei testar para ver como se comporta.

UPDATE: Executável que retorna as seguintes informações conforme parâmetros:
Link para download: goo.gl/qWk9KF


GET_ID Id do monitor Integer
GET_HEIGHT Altura em pixel Long
GET_WIDTH Largura em pixel Long
IS_MAIN Monitor principal Bool

Exemplo uso Elipse:

Sub button_Click()
	' Caminho para o executavel
	Dim filepath: filepath = "c:\temp\getmonitorinfo.exe"
	Dim wsh: Set wsh = CreateObject("WScript.Shell")
	Dim id
	Dim main
	Dim height
	Dim width


	id = CInt(wsh.Run(filepath & " GET_ID", 0, True))
	main = CBool(wsh.Run(filepath & " IS_MAIN", 0, True))
	height = CLng(wsh.Run(filepath & " GET_HEIGHT", 0, True))
	width = CLng(wsh.Run(filepath & " GET_WIDTH", 0, True))

	MsgBox "ID: " & id & vbNewLine &_
			"Principal: " & main & vbNewLine &_
			"Altura: " & height & vbNewLine &_
			"Largura: " & width
	
	Set wsh = Nothing
End Sub
2 Likes