Desenvolvimento - ASP. NET

Obtendo a resolução de Tela do usuário em ASP.NET

Quem nunca sofreu problemas com a resolução de tela de alguns usuários? Fazemos as nossas aplicações na resolução que achamos mais conveniente, normalmente maior ou igual a 1024 x 768. E adivinhe quem adora utilizar 640 x 480? O diretor da empresa...

por Avelino Ferreira Gomes Filho



Quem nunca sofreu problemas com a resolução de tela de alguns usuários? Fazemos as nossas aplicações na resolução que achamos mais conveniente, normalmente maior ou igual a 1024 x 768, e adivinhe quem adora utilizar 640 x 480, o diretor da empresa. Ainda temos que contar com o padrão da Web de 800 x 600 e existem outras configurações tão doidas que chegamos a ficar imaginando como é o monitor do sujeito.

Já pensou como seria muito bom saber como os seus usuários acessam a sua aplicação. Pelo menos para que você possa compatibilizá-la com o gosto da maioria deles. Mas, ai vem um pequeno problema: Como salvar dados que só são obtidos via Javascript,que roda no cliente, em arquivos de dados do servidor, acessados via ASP.Net? Ou seja, como fazer com que o seu código ASP.Net em VB ou C#, que roda no lado do servidor, veja qual é a resolução de tela de um usuário? Em uma primeira idéia, o desenvolvedor poderá tentar utilizar o System.Web.UI.Page.Request.Browser. Mas infelizmente ele não possui nenhuma propriedade para obtermos a resolução de tela.

A resposta é uma pequena combinação de Javascript + ASP.Net. Vamos a ela.

Primeiramente vamos criar um Web User Control e chamaremos o de Contador.ascx.

Na página que abre em decorrência desta ação, mude a visualização de Design para HTML e escreva o seguinte código Javascript.

<script language="JavaScript" type="text/javascript">
	var alturaTela;
	var larguraTela;
	
	if (screen)
	{	
		alturaTela = screen.height;
		larguraTela = screen.width;
	}
	else 
	{
		alturaTela = escape("Não identificado")
		larguraTela = escape("Não identificado")
	}
	document.writeln("<img width=0 height=0 style=\"position:absolute;\" border=0 
src=\"Resolucao.aspx?alturaTela=" + alturaTela + "&larguraTela=" + larguraTela +"\">")				
/* Você não está vendo coisas, realmente existe uma página ASPX sendo colada como se fosse 
uma figura em um código JS. */
</script>

Depois, vamos criar a nossa página que irá contabilizar a resolução de telas dos nossos usuários. A Resolucao.aspx que foi colada como imagem.

Na Resolucao.apsx poderemos colocar o seguinte código do lado do servidor.

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Fs As System.IO.StreamWriter
        Dim altura As String
        Dim largura As String

        If Not Page.IsPostBack() Then
            Fs = New System.IO.StreamWriter("c:\temp\contador.txt", True)
            altura = Request.QueryString("alturaTela")
            largura = Request.QueryString("larguraTela")
            Fs.WriteLine(altura & "[]" & largura)
            Fs.Close()
        End If

    End Sub

Pode não ser bonito, mas vai servir por enquanto.

Finalmente, vamos colar em uma página o nosso Web User Control, Contador.ascx. Que tal a Default.aspx?

Rode a aplicação. A saída irá depender da sua resolução de tela no momento.

Ex:
768[]1024
600[]800

Com isso você poderá contabilizar qual a resolução utilizada pelos seus usuários e ficará sabendo como esses acessam a sua página. Agora você poderá trabalhar a sua interface de modo que esta agrade a gregos e troianos.

Aproveite para melhorar o código. Por exemplo ao invés de salvar só a resolução de tela do usuário, por que não salvar o navegador que ele utiliza, a versão, se ele aceita Javascript, VBScript entre outros. Dê uma boa olhada no MSDN com carinho particular no HttpRequest.Browser.

Uma outra dica é ao salvar o arquivo. Ao invés do arcaico txt, por que não um XML. Caso seja muito crítico o problema, você poderá salvar até em banco de dados.

Uma última dica de melhoria poderia ser quanto a quantidade de vezes que você irá contabilizar a resolução de um usuário específico. Por exemplo, se lhe interessar o acesso por seção, você poderia mudar o código da Resolucao.aspx.

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Fs As System.IO.StreamWriter
        Dim altura As String
        Dim largura As String

        If Not Page.IsPostBack() And IsNothing(Session.Item("JaContabilizou")) Then
            Fs = New System.IO.StreamWriter("c:\temp\contador.txt", True)
            altura = Request.QueryString("alturaTela")
            largura = Request.QueryString("larguraTela")
            Fs.WriteLine(altura & "[]" & largura)
            Fs.Close()
            Session.Add("JaContabilizou", True)
        End If

    End Sub

Trabalhe também a forma como você irá extrair esses dados, pode ser com o Crytal Reports, ou Tee Chart, por exemplo.

Avelino Ferreira Gomes Filho

Avelino Ferreira Gomes Filho