【问题标题】:Open or Refresh HTML file in Default Browser在默认浏览器中打开或刷新 HTML 文件
【发布时间】:2014-12-21 05:15:46
【问题描述】:

在默认浏览器中打开 Web 文档是一个已经被回答过无数次的问题。但我对这个问题有一个转折:

如何在 C# 中在默认浏览器中打开或刷新 html 文档。

如果我尝试这样的事情:

private Process ShowFile(string htmlFilename)
{
var myProcess = new Process();

    try
    {
        // true is the default, but it is important not to set it to false
        myProcess.StartInfo.UseShellExecute = true;
        myProcess.StartInfo.FileName = htmlFilename;
        myProcess.Start();
    }
    catch (Exception e)
    {

    }

    return myProcess;
}

每次都会打开一个新窗口。

* 编辑 *

我试过了,但是浏览器没有刷新

public delegate bool EnumThreadWindowsCallback(int hWnd, int lParam);

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);

    [DllImport("user32.dll")]
    static extern int GetWindowText(int hWnd, StringBuilder text, int count);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static public extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);


    private bool FindWindowByRx(int hWnd, int lParam)
    {
        Regex pattern = new Regex("Seneste nyt", RegexOptions.IgnoreCase);
        StringBuilder windowTitle = new StringBuilder(256);
        GetWindowText(hWnd, windowTitle, 255);

        if (pattern.IsMatch(windowTitle.ToString()))
        {
            SetForegroundWindow(new IntPtr(hWnd));
            return false; // abort search
        }
        else
        {
            return true; // keep on searching
        }
    }

    private bool ActivateWindow()
    {
        return EnumWindows(new EnumThreadWindowsCallback(FindWindowByRx), new IntPtr());

        uint KEYEVENTF_KEYUP = 2;
        byte VK_CONTROL = 0x11;
        byte VK_F5= 0x74;

        keybd_event(VK_CONTROL, 0, 0, 0);
        keybd_event(VK_F5, 0, 0, 0);             
        keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    }

它只会获得焦点。

【问题讨论】:

  • 您在 ActivateWindow() 函数的开头有一个 return 语句。
  • 删除它时它可以工作:D
  • 太棒了。对了,你可以treat warning as errorsreturn 语句会导致 Visual Studio 发出 Unreachable code detected 警告。如果treat warnings as errors 设置为All,您的代码将不会编译。因此,SO 上的时间更少,编码的时间更多:)。
  • 我会马上做的。我只是还没有考虑过。这很奇怪,因为我已经编写 Delphi 很多年了,而且我的 Delphi 始终设置为将提示和警告都视为错误。

标签: c# .net


【解决方案1】:

首先,包含您要刷新的页面的浏览器选项卡必须是选定的选项卡。根据this SO question,您无法激活包含某个网址的选项卡。你可以find all the urls of the opened tabs,但你不能选择你想要的标签。

因此,假设选项卡已被选中,您只需find and activate the browser's window 并向其发送类似于Get the selected Text from other Process 的组合键即可。例如,对于 Firefox,您只能发送 ctr+l(这会将光标放在地址字段上)和 enter(这将刷新页面)而不是 ctrl+c

或者,至少对于 Firefox,您可以发送 ctrl+w,它会关闭当前选定的选项卡,然后像您的代码一样打开一个新页面,在您的情况下,这将与您完全相同的页面'刚刚关门。

或者,您可以在新的浏览器实例(不是新标签页)中打开您的页面。当您想刷新它时,您可以按名称找到该浏览器窗口并将其关闭。然后重新打开一个新的浏览器窗口。这将是一个解决方案,以防您感兴趣的选项卡当前可能不是您浏览器中选定的选项卡

【讨论】:

  • 我们越来越近了,但我不在那里。我刚刚编辑了我的问题,以便您查看我的尝试
猜你喜欢
  • 2013-12-22
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多