如何使用c#以编程方式将html字符串直接传递给Web浏览器?

时间:2012-09-24 15:01:26

标签: c# browser notepad

嗯,例如我有一些简单的控制台应用程序。我的目的是生成一些报告,并在一些外部应用程序(如记事本或Web浏览器)中向用户表示。

class Program
    {
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

        static void Main()
        {
            OpenNotepadAndInputTextInIt("Message in notepad");
            OpenHtmlFileInBrowser(@"c:\temp\test.html");
        }

        private static string GetDefaultBrowserPath()
        {
            string key = @"HTTP\shell\open\command";
            using(RegistryKey registrykey = Registry.ClassesRoot.OpenSubKey(key, false))
            {
                return ((string)registrykey.GetValue(null, null)).Split('"')[1];
            }
        }

        private static void OpenHtmlFileInBrowser(string localHtmlFilePathOnMyPc)
        {
            Process browser = Process.Start(new ProcessStartInfo(GetDefaultBrowserPath(), string.Format("file:///{0}", localHtmlFilePathOnMyPc)));
            browser.WaitForInputIdle();

        }

        private static void OpenNotepadAndInputTextInIt(string textToInputInNotepad)
        {
            Process notepad = Process.Start(new ProcessStartInfo("notepad.exe"));
            notepad.WaitForInputIdle();
            if(notepad != null)
            {
                IntPtr child = FindWindowEx(notepad.MainWindowHandle, new IntPtr(0), "Edit", null);
                SendMessage(child, 0x000C, 0, textToInputInNotepad);
            }
        }
    }

这个解决方案很好,但是你可以看到我有两种方法; GetDefaultBrowserPath()GetDefaultBrowserPath(string localHtmlFilePathInMyPc)。第一个将消息字符串直接传递给记事本窗口,但第二个需要创建一个文件,一些html页面,然后将此html文件作为Web浏览器的参数传递。这是一种缓慢的解决方案。 我想生成一个html字符串报告,并将其直接传递到网络浏览器,而不会创建中间的html文件。

1 个答案:

答案 0 :(得分:2)

如果您想在系统的默认浏览器应用程序中打开外部浏览器窗口(而不是将其集成到您的应用程序中),我认为唯一的方法是通过data URI

data:text/html,<html><title>Hello</title><p>This%20is%20a%20test

将此作为URI传递到浏览器中。但是,我真的不建议这样做。对于用户来说这是意料之外的,并且生成要显示的临时文件并没有真正的缺点,是吗?此外,您可能会很快开始对URI长度进行限制。

顺便提一下,您目前在浏览器中打开文件的方式比需要的方式复杂得多。 Shell执行自己做正确的事情,无需手动从注册表中检索浏览器的路径:

Process.Start("file:///the/path/here")