Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:打开浏览器并从windows桌面应用程序发布到url_C#_Wpf_Browser_Post - Fatal编程技术网

C#:打开浏览器并从windows桌面应用程序发布到url

C#:打开浏览器并从windows桌面应用程序发布到url,c#,wpf,browser,post,C#,Wpf,Browser,Post,我有一个小的WPF应用程序(尽管我想它是WPF表单还是webform应用程序并不重要),我想启动一个新的浏览器窗口并发布到特定的url。我一直在胡闹: System.Diagnostics.Process.Start("http://myurl.com"); 启动窗口,但我不认为我可以使用相同的过程来实际发布到url…我也尝试过HttpWebRequest,但我希望用户能够在我发布到该url后使用该应用程序,不只是向他们展示结果……我可以看什么来做这样的事情?没有直接的方法。您可以做的是生成一

我有一个小的WPF应用程序(尽管我想它是WPF表单还是webform应用程序并不重要),我想启动一个新的浏览器窗口并发布到特定的url。我一直在胡闹:

System.Diagnostics.Process.Start("http://myurl.com");

启动窗口,但我不认为我可以使用相同的过程来实际发布到url…我也尝试过HttpWebRequest,但我希望用户能够在我发布到该url后使用该应用程序,不只是向他们展示结果……我可以看什么来做这样的事情?

没有直接的方法。您可以做的是生成一个HTML页面,其中包含一个表单,表单中填充了您需要发布的数据,并使用一点javascript在加载页面时自动发布页面。然后你只需在浏览器中打开该页面

生成的HTML可能如下所示:

<html>
<head>
<script language="Javascript">
function submitForm() {
    var theForm = document.getElementById("theForm");
    theForm.submit();
}
</script>
</head>
<body onload="submitForm()">
<form id="theForm" action="http://myurl.com" method="POST">
    <input type="text" name="username" value="myusername"/>
    <input type="password" name="password" value="mypassword"/>
</form>
</body>
</html>

函数submitForm(){
var theForm=document.getElementById(“theForm”);
submit()格式;
}

如果页面必须显示在应用程序中,请将其加载到
WebBrowser
控件中,而不要使用。

您可以创建隐藏控件并执行(使用允许您指定请求方法的重载)。您需要指定一个“空白”目标框,以便在新的浏览器窗口中进行导航。

有多种解决方案,不确定哪种方案最适合您

  • 继续你原来的方法
  • 按照其他答案中的建议,在应用程序中嵌入web浏览器控件
  • 以编程方式“幕后”完成所有事情
  • 对于#3,您可以在这里查看:

    如果您想使用#1,那么它就更复杂了,因为您需要控制外部应用程序,不同的浏览器会有不同的行为

    在处理一个“用户不友好”的应用程序时,我使用了“javascript:”协议和下面的代码,IE作为默认浏览器。请注意,它不是“生产就绪”代码。并没有错误处理,用户可以将焦点从启动的浏览器转移,或者使用不支持“javascript:”协议的浏览器等

    static void Main()
    {
        Settings s = Settings.Default;
        Process.Start(s.URL1);
        Thread.Sleep(s.Delay1);
        SendKeys.SendWait("%D");
        Thread.Sleep(100);
        SendKeys.SendWait(EncodeForSendKey(s.URL2));
        SendKeys.SendWait("{ENTER}");
    }
    
    public static string EncodeForSendKey(string value)
    {
        StringBuilder sb = new StringBuilder(value);
        sb.Replace("{", "{{}");
        sb.Replace("}", "{}}");
        sb.Replace("{{{}}", "{{}");
        sb.Replace("[", "{[}");
        sb.Replace("]", "{]}");
        sb.Replace("(", "{(}");
        sb.Replace(")", "{)}");
        sb.Replace("+", "{+}");
        sb.Replace("^", "{^}");
        sb.Replace("%", "{%}");
        sb.Replace("~", "{~}");
        return sb.ToString();
    }
    
    • URL1:
    • URL2:javascript:function x(){document.all.q.value='stackoverflow';document.forms[0].submit();}x()
    你为什么有ASP.NET标签?啊,对不起,只是习惯于放在那里,把它去掉了。是的。以下是我最终使用这种方法的方式。将HTML代码写入临时文件,然后使用文件上的
    Process.Start()
    在浏览器中打开它。它比按键更健壮,并且可以在用户选择为默认的任何体面浏览器上工作。