none
Ajuda com Java Script RRS feed

  • Pergunta

  • Pessoal, boa tarde!

    Eu fiz esse java script abaixo para abrir meu sistema maximizado e para caso a configuração de vídeo do usuário não for 1280 para enviar uma mensagem, no entanto eu gostaria de melhora-lo inserindo o seguinte. Depois da mensagem gostaria que viesse a seguinte pergunta. "Deseja  ajustar sua configuração de vídeo agora?"  e por dois botôes um de sim e outro de não.

    Caso o usuário clique em sim eu modifico a configuração de vídeo para a que meu sistema mais se adequa, em caso negativo abre normalmente o sistema.

    Alguem saberia me ajudar?

    Grato desde já

    Gustavo

     

    Code Snippet

    <script language="JavaScript1.2">
    top.window.moveTo(0,0);
    if (document.all)
       { top.window.resizeTo(screen.availWidth,screen.availHeight); }
    else if
       (document.layers || document.getElementById)
       {
       if
        (top.window.outerHeight < screen.availHeight || top.window.outerWidth <
    screen.availWidth)
         { top.window.outerHeight = top.screen.availHeight;
           top.window.outerWidth = top.screen.availWidth; }
       }
      
     if(screen.width != "1280") {
    alert('Esse site será melhor visualizado na seguinte configuração de vídeo: 1280X1024. Outras configurações podem gerar discrepâncias no layout!')

    </script>

     

     

     

    segunda-feira, 27 de outubro de 2008 16:07

Respostas

  • Usando apenas JavaScript é impossivel Gustavo, mas você pode usar o próprio C# para fazer isso. Para tal, crie uma classe chamada Resolution.cs no seu projeto, e cole o código abaixo:

     

    Code Snippet

    using System;

    using System.Windows.Forms;

    using System.Runtime.InteropServices;

    [StructLayout(LayoutKind.Sequential)]

    public struct DEVMODE1

    {

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

    public string dmDeviceName;

    public short dmSpecVersion;

    public short dmDriverVersion;

    public short dmSize;

    public short dmDriverExtra;

    public int dmFields;

    public short dmOrientation;

    public short dmPaperSize;

    public short dmPaperLength;

    public short dmPaperWidth;

    public short dmScale;

    public short dmCopies;

    public short dmDefaultSource;

    public short dmPrintQuality;

    public short dmColor;

    public short dmDuplex;

    public short dmYResolution;

    public short dmTTOption;

    public short dmCollate;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

    public string dmFormName;

    public short dmLogPixels;

    public short dmBitsPerPel;

    public int dmPelsWidth;

    public int dmPelsHeight;

    public int dmDisplayFlags;

    public int dmDisplayFrequency;

    public int dmICMMethod;

    public int dmICMIntent;

    public int dmMediaType;

    public int dmDitherType;

    public int dmReserved1;

    public int dmReserved2;

    public int dmPanningWidth;

    public int dmPanningHeight;

    };

     

     

    class User_32

    {

    [DllImport("user32.dll")]

    public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);

    [DllImport("user32.dll")]

    public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags);

    public const int ENUM_CURRENT_SETTINGS = -1;

    public const int CDS_UPDATEREGISTRY = 0x01;

    public const int CDS_TEST = 0x02;

    public const int DISP_CHANGE_SUCCESSFUL = 0;

    public const int DISP_CHANGE_RESTART = 1;

    public const int DISP_CHANGE_FAILED = -1;

    }

     

    namespace Resolution

    {

    public class CResolution

    {

    public CResolution(int a, int b)

    {

    Screen screen = Screen.PrimaryScreen;

     

    int iWidth = a;

    int iHeight = b;

     

    DEVMODE1 dm = new DEVMODE1();

    dm.dmDeviceName = new String(new char[32]);

    dm.dmFormName = new String(new char[32]);

    dm.dmSize = (short)Marshal.SizeOf(dm);

    if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))

    {

    dm.dmPelsWidth = iWidth;

    dm.dmPelsHeight = iHeight;

    int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);

    if (iRet == User_32.DISP_CHANGE_FAILED)

    {

    MessageBox.Show("Unable to process your request");

    MessageBox.Show("Description: Unable To Process Your Request. Sorry For This Inconvenience.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    else

    {

    iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);

    switch (iRet)

    {

    case User_32.DISP_CHANGE_SUCCESSFUL:

    {

    break;

    //successfull change

    }

    case User_32.DISP_CHANGE_RESTART:

    {

    MessageBox.Show("Description: You Need To Reboot For The Change To Happen.\n If You Feel Any Problem After Rebooting Your Machine\nThen Try To Change Resolution In Safe Mode.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    break;

    //windows 9x series you have to restart

    }

    default:

    {

    MessageBox.Show("Description: Failed To Change The Resolution.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    break;

    //failed to change

    }

    }

    }

    }

    }

    }

    }

     

     

    Feito isso, quando quiser mudar a resolução do sistema, é só instanciar a classe. Para o seu caso, basta usar o seguinte código:

     

    Code Snippet

    using System;

    using System.Configuration;

    using System.Data;

    using System.Linq;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.HtmlControls;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Xml.Linq;

    using System.Windows.Forms;

    public partial class _Default : System.Web.UI.Page

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    int ScreenWidth, ScreenHeight;

    ScreenWidth = Screen.PrimaryScreen.Bounds.Width;

    ScreenHeight = Screen.PrimaryScreen.Bounds.Height;

    if ((ScreenWidth != 1280) && (ScreenHeight != 1024))

    {

    if (MessageBox.Show("Esse site ser  melhor visualizado na seguinte configura‡Æo de v¡deo: 1280X1024. Outras configura‡äes podem gerar discrepƒncias no layout!\nDeseja alterar a resolu‡Æo?", "Confirma", MessageBoxButtons.YesNo) == DialogResult.Yes)

    {

    Resolution.CResolution CR = new Resolution.CResolution(1280, 1024);

    }

    }

    }

    }

     

     

    Testei aqui e funcionou...

    Espero que de certo no seu site.

    terça-feira, 28 de outubro de 2008 12:03

Todas as Respostas

  •  

    Cara, pelo que eu sei, não tem como redimensionar a resolução do usuário usando JavaScript....

    Geralmente, o sistema que se adequa ao usuário, e não o usuário que se adequa ao sistema...

     

    Leve em consideração que a resolução 1280x1024 não é a preferida entre os usuários, e ela não é compativel com muitos computadores por ai...

    segunda-feira, 27 de outubro de 2008 16:31
  • Olá Gustavo,

    Seria isso que você precisa?


    <script language="JavaScript1.2">
    top.window.moveTo(0,0);
    if (document.all)
       { top.window.resizeTo(screen.availWidth,screen.availHeight); }
    else if
       (document.layers || document.getElementById)
       {
       if
        (top.window.outerHeight < screen.availHeight || top.window.outerWidth <
    screen.availWidth)
         { top.window.outerHeight = top.screen.availHeight;
           top.window.outerWidth = top.screen.availWidth; }
       }
      
     if(screen.width != "1280") {
    alert('Esse site será melhor visualizado na seguinte configuração de vídeo: 1280X1024. Outras configurações podem gerar discrepâncias no layout!')


    var r=confirm("Deseja  ajustar sua configuração de vídeo agora?");
    if (r==true)
      {

       //Aqui estará o códgo para o ajuste das configurações de vídeo
      document.write(" OK foi pressionado");
      }
    else
      {
      document.write("Cancelar foi pressionado");
      }

    </script>


    segunda-feira, 27 de outubro de 2008 16:39
  • Olá Gustavo,

    Estava pesquisando na internet (
    http://forum.imasters.uol.com.br/index.php?showtopic=221329) e vi que não é possível alterar a reolução. Conforme o Guilherme tinha comentado...
    Desculpas pelo meu post anterior, estou começando a desenvolver agora.

    Abraços
    segunda-feira, 27 de outubro de 2008 16:54
  • Impossível? acho que não, pois eu ja entrei em alguns sites que tem essa funcionalidade....e hoje em dia na informática é praticamente tudo possível rsrs.

    Mas muitissimo obrigado pela ajuda!

    Vou continuar pesquisando e se alguem souber a solução por favor faça um post .

    Grato desde já

    Gustavo

     

    segunda-feira, 27 de outubro de 2008 17:03
  • Existe como eu adaptar esse VBScript no java Script ou no código do meu sistema em C#??

    Esse script abaixo modifica a resolução de tela.

     

    Code Snippet

    WshShell.RegWrite "HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\LMIMIRR\DEVICE0\DefaultSettings.XResolution","1024","REG_DWORD"

    WshShell.RegWrite "HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\LMIMIRR\DEVICE0\DefaultSettings.YResolution" ,"768","REG_DWORD"

     

     

     

    Att

    Gustavo

    segunda-feira, 27 de outubro de 2008 18:12
  • Outra maneira de fazer isso, mas agora usando a api do windows...precisa fazer isso via meu sistema...

     

     

    Code Snippet
    #include <windows.h>

    int main()
    {
        DEVMODE dm;

        ZeroMemory( &dm, sizeof( DEVMODE ) );
        dm.dmSize = sizeof( DEVMODE );
        dm.dmBitsPerPel = 32;
        dm.dmPelsWidth = 1024;
        dm.dmPelsHeight = 768;
        dm.dmDisplayFrequency = 60;
        dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;

        ChangeDisplaySettings( &dm, 0 );
       
        return 0;
    }

     

     

     

    segunda-feira, 27 de outubro de 2008 18:18
  • Usando apenas JavaScript é impossivel Gustavo, mas você pode usar o próprio C# para fazer isso. Para tal, crie uma classe chamada Resolution.cs no seu projeto, e cole o código abaixo:

     

    Code Snippet

    using System;

    using System.Windows.Forms;

    using System.Runtime.InteropServices;

    [StructLayout(LayoutKind.Sequential)]

    public struct DEVMODE1

    {

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

    public string dmDeviceName;

    public short dmSpecVersion;

    public short dmDriverVersion;

    public short dmSize;

    public short dmDriverExtra;

    public int dmFields;

    public short dmOrientation;

    public short dmPaperSize;

    public short dmPaperLength;

    public short dmPaperWidth;

    public short dmScale;

    public short dmCopies;

    public short dmDefaultSource;

    public short dmPrintQuality;

    public short dmColor;

    public short dmDuplex;

    public short dmYResolution;

    public short dmTTOption;

    public short dmCollate;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

    public string dmFormName;

    public short dmLogPixels;

    public short dmBitsPerPel;

    public int dmPelsWidth;

    public int dmPelsHeight;

    public int dmDisplayFlags;

    public int dmDisplayFrequency;

    public int dmICMMethod;

    public int dmICMIntent;

    public int dmMediaType;

    public int dmDitherType;

    public int dmReserved1;

    public int dmReserved2;

    public int dmPanningWidth;

    public int dmPanningHeight;

    };

     

     

    class User_32

    {

    [DllImport("user32.dll")]

    public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);

    [DllImport("user32.dll")]

    public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags);

    public const int ENUM_CURRENT_SETTINGS = -1;

    public const int CDS_UPDATEREGISTRY = 0x01;

    public const int CDS_TEST = 0x02;

    public const int DISP_CHANGE_SUCCESSFUL = 0;

    public const int DISP_CHANGE_RESTART = 1;

    public const int DISP_CHANGE_FAILED = -1;

    }

     

    namespace Resolution

    {

    public class CResolution

    {

    public CResolution(int a, int b)

    {

    Screen screen = Screen.PrimaryScreen;

     

    int iWidth = a;

    int iHeight = b;

     

    DEVMODE1 dm = new DEVMODE1();

    dm.dmDeviceName = new String(new char[32]);

    dm.dmFormName = new String(new char[32]);

    dm.dmSize = (short)Marshal.SizeOf(dm);

    if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))

    {

    dm.dmPelsWidth = iWidth;

    dm.dmPelsHeight = iHeight;

    int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);

    if (iRet == User_32.DISP_CHANGE_FAILED)

    {

    MessageBox.Show("Unable to process your request");

    MessageBox.Show("Description: Unable To Process Your Request. Sorry For This Inconvenience.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    else

    {

    iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);

    switch (iRet)

    {

    case User_32.DISP_CHANGE_SUCCESSFUL:

    {

    break;

    //successfull change

    }

    case User_32.DISP_CHANGE_RESTART:

    {

    MessageBox.Show("Description: You Need To Reboot For The Change To Happen.\n If You Feel Any Problem After Rebooting Your Machine\nThen Try To Change Resolution In Safe Mode.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    break;

    //windows 9x series you have to restart

    }

    default:

    {

    MessageBox.Show("Description: Failed To Change The Resolution.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    break;

    //failed to change

    }

    }

    }

    }

    }

    }

    }

     

     

    Feito isso, quando quiser mudar a resolução do sistema, é só instanciar a classe. Para o seu caso, basta usar o seguinte código:

     

    Code Snippet

    using System;

    using System.Configuration;

    using System.Data;

    using System.Linq;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.HtmlControls;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Xml.Linq;

    using System.Windows.Forms;

    public partial class _Default : System.Web.UI.Page

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    int ScreenWidth, ScreenHeight;

    ScreenWidth = Screen.PrimaryScreen.Bounds.Width;

    ScreenHeight = Screen.PrimaryScreen.Bounds.Height;

    if ((ScreenWidth != 1280) && (ScreenHeight != 1024))

    {

    if (MessageBox.Show("Esse site ser  melhor visualizado na seguinte configura‡Æo de v¡deo: 1280X1024. Outras configura‡äes podem gerar discrepƒncias no layout!\nDeseja alterar a resolu‡Æo?", "Confirma", MessageBoxButtons.YesNo) == DialogResult.Yes)

    {

    Resolution.CResolution CR = new Resolution.CResolution(1280, 1024);

    }

    }

    }

    }

     

     

    Testei aqui e funcionou...

    Espero que de certo no seu site.

    terça-feira, 28 de outubro de 2008 12:03
  • Guilherme, mutissimo obrigado pela força...mas vc esta usando VS2008?

    Aqui eu estou usando o VS2005....pergunto isso porque vc esta usando linq.

    Grato desde já

    Gustavo

     

    terça-feira, 28 de outubro de 2008 16:54
  • Guilherne, olha o que aconteceu.

    Primeiro que apesar de eu setar minha configuração para 1024X768 o programa sempre atribui as va´riáveis screenwidth e screenheigth os valores 1280 e 800 respectivamente, e como o if tem a codição && e não || acaba não entrando no if.

    Mas mesmo forçando ele tentar modificar da erro e não modifica.

    Porque será?

    Att

    Gustavo

     

    terça-feira, 28 de outubro de 2008 17:04
  • Já tentou debugar pra ver o porque que as variaveis estão pegando estes valores?

    E qual erro que dá? O "Description: Failed To Change The Resolution."??
    terça-feira, 28 de outubro de 2008 17:05
  • Cara, maravilha deu certo mesmo!!!

    Muito obrigado!!

    Abracoxx

     

    terça-feira, 28 de outubro de 2008 17:10
  • Cara, muito cedo para comemorar...funcionou localmente, mas remotamente quando acesso servidor não...segue abixo o erro:

     

    Server Error in '/BSHInfo' Application.

    Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.InvalidOperationException: Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.

    Source Error:

    Line 29:         {
    Line 30: 
    Line 31:             if (MessageBox.Show("Esse site ser  melhor visualizado na seguinte configura‡Æo de v¡deo: 1280X1024. Outras configura‡äes podem gerar discrepƒncias no layout!\nDeseja alterar a resolu‡Æo?", "Confirma", MessageBoxButtons.YesNo) == DialogResult.Yes)
    Line 32:             {
    Line 33: 

    Source File: e:\Recursos\inetpub\wwwroot\Intranet\Intranet.bsh\sistemas\sig\BSHInfo\Index.aspx.cs    Line: 31

    Stack Trace:

    [InvalidOperationException: Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.]
       System.Windows.Forms.MessageBox.ShowCore(IWin32Window owner, String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, Boolean showHelp) +1799842
       System.Windows.Forms.MessageBox.Show(String text, String caption, MessageBoxButtons buttons) +21
       Index.Page_Load(Object sender, EventArgs e) in e:\Recursos\inetpub\wwwroot\Intranet\Intranet.bsh\sistemas\sig\BSHInfo\Index.aspx.cs:31
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
       System.Web.UI.Control.OnLoad(EventArgs e) +99
       System.Web.UI.Control.LoadRecursive() +47
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
    


    Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

     

    terça-feira, 28 de outubro de 2008 17:23
  •  

    Alguem sabe como resolver esse problema?

    eu poderia utilizar js (comando alert) no evento onclick de um button por exemplo, mas essa messagem não esta vinculada a nenhum objeto, ela simplismente deve aparecer na hora que o usuário entra na pagina.

     

    Alguem sugere alguma coisa??

     

    Grato desde já

    Gustavo

     

    quarta-feira, 29 de outubro de 2008 11:59
  • Eu até sei como executar um javascript sem o vincular a nenhum objeto, mas usando o modo que eu conheço não daria pra pegar o valor do confirm e poder usar a condição...

     

    Vou dar uma olhada no MessageBox, já usei ele em um servidor remoto, só não lembro se tive que configurar algo...

    quarta-feira, 29 de outubro de 2008 13:30
  • Ok, tente mudar aquele if para esse daqui:

     

    Code Snippet

    protected void Page_Load(object sender, EventArgs e)

    {

    int ScreenWidth, ScreenHeight;

    ScreenWidth = Screen.PrimaryScreen.Bounds.Width;

    ScreenHeight = Screen.PrimaryScreen.Bounds.Height;

    if ((ScreenWidth != 1280) && (ScreenHeight != 1024))

    {

    if (MessageBox.Show("Esse site ser melhor visualizado na seguinte configura‡Æo de v¡deo: 1280X1024. Outras configura‡äes podem gerar discrepƒncias no layout!\nDeseja alterar a resolu‡Æo?", "Confirma", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification) == DialogResult.Yes)

    {

    Resolution.CResolution CR = new Resolution.CResolution(1280, 1024);

    }

    }

    }

     

     

     

     

     

    quarta-feira, 29 de outubro de 2008 13:40
  • Guilherme,

     

    Este código de mudar a resolução não é apenas para WinApp?

    Digo isso porque como o C# trabalha no lado do servidor, como q será alterada a resolução do usuário?

    quarta-feira, 29 de outubro de 2008 15:09
  • Realmente não deu certo...o sistema njão abr quando insiro esse código, fica tentando carregar no IE, mas  não carrega. Basta tirar o código que o sistema abre normal.....

    Alguem saberia dizre o que fazer?

     

    quarta-feira, 29 de outubro de 2008 18:15
  • Preciso de uma luz!! alguem saberia me ajudar?

    Grato desde já

    Gustavo

     

    quinta-feira, 30 de outubro de 2008 12:38
  • Alguem?

     

     

    sexta-feira, 31 de outubro de 2008 12:18
  •  

    Fiquei um tempo ausente do fórum, por isso demorei pra responder...

    Bom, tem como você debugar o código e ver aonde ele está demorando pra carregar?

    sexta-feira, 31 de outubro de 2008 12:50
  • Então, fiz de tudo para tentar debbugar no servidor, mas não consegui....

    Acontece que localmente funciona, mas quando rodando no servidor o sistema simplismente trava e não abre nada....

    O que pode ser?

    Att

    terça-feira, 4 de novembro de 2008 19:40
  • Alguem saberia outra maneira de fazer essa modificação na configuração de vídeo do usuário, ou saberia resolver esse problema?

    Grato desde já

    Gustavo

     

    quarta-feira, 5 de novembro de 2008 16:48
  • Alguem?

     

    quarta-feira, 5 de novembro de 2008 17:50
  • Pessoal, preciso de uma ajuda aqui! Se alguem souber por favor me ajude!!!

     

    quinta-feira, 6 de novembro de 2008 11:21