如何摆脱IE 8中的“离线模式”消息弓?

时间:2013-05-07 09:01:12

标签: c# internet-explorer winapi internet-explorer-8

我想完全摆脱“脱机工作”消息框。

enter image description here

要提供某些背景信息,此消息框会显示在运行本地 webapp的计算机上。 对网络的访问显然是不稳定的,因此暂时缺乏永远不会阻塞:它只会延迟一些后台通知。网页仅需要显示本地资源。网址看起来像http://localhost:4444/*myApp*/...

该机器在XP专业版上运行,浏览器为IE8。

我尝试了以下解决方案但没有成功:

  1. 手动取消选中菜单选项文件/离线工作是不够的。
  2. 将注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\WebCheck\LoadSensLoadLCE设置为 auto ,然后 no ,然后 { {1}}
  3. 我试图以每200ms调用此方法以编程方式强制在线模式

    yes
  4. 最后的尝试几乎可行。 '离线工作'永远不会被检查,但有时(确实非常随机)会出现邪恶的消息框。问题是,尽管它永远不会阻塞(工作模式切换到在线以便页面正常工作)但它会干扰最终用户。

    一句话:即使看起来有点奇怪,我们也无法改变架构(本地Web应用程序)。

1 个答案:

答案 0 :(得分:1)

由于其他人无法帮助我,我终于找到了解决方案。有点脏,但工作一个。 诀窍是模拟点击“再试一次”按钮。我是通过使用user32.dll函数完成的。以下是步骤:

  1. 您首先使用FindWindow函数找到父窗口的句柄。
  2. 您可以在其标题及其父窗口的句柄中找到FindWindowEx的按钮。
  3. 您最后使用SendMessage
  4. 发送了点击

    以下是所需功能的声明

    // For Windows Mobile, replace user32.dll with coredll.dll
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    
    const uint WM_CLOSE = 0x10;
    const uint BM_CLICK = 0x00F5;
    

    以下是使用它们的方法

    private bool ClickButton(String window, String button)
    {
        IntPtr errorPopUp;
        IntPtr buttonHandle;
    
        bool found = false;
        try
        {
            errorPopUp = FindWindow(null, window.Trim());
            found = errorPopUp.ToInt32() != 0;
            if (found)
            {
                found = false;
                buttonHandle = FindWindowEx(errorPopUp, IntPtr.Zero, null, button.Trim());
                found = buttonHandle.ToInt32() != 0;
                if (found)
                {
                    SendMessage(buttonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
                    Trace.WriteLine("Clicked \"" + button + "\" on window named \"" + window + "\"");
                }
                else
                {
                    Debug.WriteLine("Found Window \"" + window + "\" but not its button \"" + button + "\"");
                }
            }
    
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }
        return found;
    }
    

    window是该窗口的标题(= “脱机工作”)和button按钮的标题(= “& Try Again” )。

    注意:不要忘记字幕字母前面的&符号(“&”)。