Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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++ 为C+;中的所有请求向WebBrowser控件添加自定义标头+/CLI?_C++_.net_Winforms_C++ Cli_Webbrowser Control - Fatal编程技术网

C++ 为C+;中的所有请求向WebBrowser控件添加自定义标头+/CLI?

C++ 为C+;中的所有请求向WebBrowser控件添加自定义标头+/CLI?,c++,.net,winforms,c++-cli,webbrowser-control,C++,.net,Winforms,C++ Cli,Webbrowser Control,我试图在C++/CLI中重现这一点,但它不起作用,以下是我的代码: private: System::Void WebBrowser1_Navigating(System::Object^ sender, System::Windows::Forms::WebBrowserNavigatingEventArgs^ e) { System::Diagnostics::Debug::WriteLine("Running..."); auto activeXInstance = (SH

我试图在C++/CLI中重现这一点,但它不起作用,以下是我的代码:

private: System::Void WebBrowser1_Navigating(System::Object^ sender, System::Windows::Forms::WebBrowserNavigatingEventArgs^ e) {
    System::Diagnostics::Debug::WriteLine("Running...");
    auto activeXInstance = (SHDocVw::IWebBrowser2^) this->webBrowser1->GetType()->InvokeMember("ActiveXInstance", System::Reflection::BindingFlags::GetProperty | System::Reflection::BindingFlags::Instance | System::Reflection::BindingFlags::NonPublic, nullptr, this->webBrowser1, gcnew array<System::Object^>{});
    System::Diagnostics::Debug::WriteLine("I won't be printed.");
    auto setupEvents2 = (SHDocVw::DWebBrowserEvents2_Event^) activeXInstance;
    setupEvents2->BeforeNavigate2 += gcnew SHDocVw::DWebBrowserEvents2_BeforeNavigate2EventHandler(this, &MyForm::OnBeforeNavigate2);
}

private: System::Void OnBeforeNavigate2(System::Object^ pDisp, System::Object^% URL, System::Object^% Flags, System::Object^% TargetFrameName, System::Object^% PostData, System::Object^% Headers, bool %Cancel) {
    Headers = "User-Agent:Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19";
}
private:System::Void WebBrowser1\u导航(System::Object^sender,System::Windows::Forms::WebBrowserNavigatingEventArgs^e){
系统::诊断::调试::写线(“正在运行…”);
auto-activeXInstance=(SHDocVw::IWebBrowser2^)this->webBrowser1->GetType()->InvokeMember(“activeXInstance”,System::Reflection::BindingFlags::GetProperty | System::Reflection::BindingFlags::Instance | System::Reflection::BindingFlags::NonPublic,nullptr,this->webBrowser1,gcnew array{});
System::Diagnostics::Debug::WriteLine(“我不会被打印”);
自动设置事件2=(SHDocVw::dwebbrowservents2_Event^)activeXInstance;
setupEvents2->BeforeNavigate2+=gcnew SHDocVw::DWebBrowserEvents2\u BeforeNavigate2EventHandler(this,&MyForm::OnBeforeNavigate2);
}
private:System::Void OnBeforeNavigate2(System::Object^pDisp,System::Object^%URL,System::Object^%Flags,System::Object^%TargetFrameName,System::Object^%PostData,System::Object^%Header,bool%Cancel){
Headers=“用户代理:Mozilla/5.0(Linux;Android 4.0.4;Galaxy Nexus Build/IMM76B)AppleWebKit/535.19(KHTML,如Gecko)Chrome/18.0.1025.133 Mobile Safari/535.19”;
}

该方法被执行,但是它在第一行停止,下一行被限制,并且没有抛出异常。

这就是我在
C#
中解决问题的方法:

  • 添加了对
    SHDocVw
    的引用。您可以在Reference manager窗口的COM选项卡中找到作为“Microsoft Internet控件”的
    SHDocVw
  • 浏览
    about:blank
    *订阅了
    DWebBrowserEvents2\u事件的
    之前导航2
    事件
    。我从
    webBrowser1.ActiveXInstance
    获得了该接口的实例
  • BeforeNavigate2
    事件处理程序中,我检查我感兴趣的头是否不存在于头中,如果URL是http或https URL(例如,不是javascript:URL),如果请求不是针对iframe,则停止请求并发送带有新头的请求
以下是我所期望的代码:

string additionalHeader = "User-Agent:Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; " +
    "Microsoft; Lumia 950 XL Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) " +
    "Chrome/52.0.2743.116 Mobile Safari/537.36 Edge/15.15063\r\n";
private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.ScriptErrorsSuppressed = true;
    webBrowser1.Navigate("about:blank", null, null, additionalHeader);
    var wbevents = (DWebBrowserEvents2_Event)webBrowser1.ActiveXInstance;
    wbevents.BeforeNavigate2 += Wbevents_BeforeNavigate2;
    webBrowser1.Navigate("http://google.com", null, null, additionalHeader);
}

private void Wbevents_BeforeNavigate2(object pDisp, ref object URL, ref object Flags,
    ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
    if (!$"{Headers}".Contains(additionalHeader) &&
        TargetFrameName == null &&
        $"{URL}".ToLower().StartsWith("http"))
    {
        Cancel = true;
        ((IWebBrowser2)pDisp).Stop();
        object headers = additionalHeader + $"{Headers}";
        object url = $"{URL}";
        object flags = null;
        object targetFrameName = $"{TargetFrameName}";
        ((IWebBrowser2)pDisp).Navigate2(ref url, ref flags,
            ref targetFrameName, ref PostData, ref headers);
    }
}
注意1-刷新时不会引发导航

具有刷新功能的浏览器中存在功能/缺陷。刷新浏览器时,
导航
事件将不会引发,这意味着刷新时不会添加标题。解决方法是禁用快捷方式和关联菜单:

this.webBrowser1.WebBrowserShortcutsEnabled = false;
this.webBrowser1.IsWebBrowserContextMenuEnabled = false;
注2-设置用户代理

因为这个问题是关于为用户代理添加头的,所以有一个更好的解决方案。您可以使用本文底部共享的解决方案:


即使您刷新浏览器,它也能正常工作。

不幸的是,它不适用于重定向您的网站。例如,下面的google搜索:movies123pro,第一个链接引用,它将重定向到沿途的几个链接,例如:。。。然后它会出现在一个空白屏幕上,或者有时会出现在随机的网站上,具体取决于您的请求。即使不改变标题也不行。我稍后会测试它,看看如何解决这个问题。我认为这是正确的方向。@Rafa更新了答案。很棒的更新!现在工作很好,非常感谢!我发现在webBrowser1->Refresh()之后,它会在这个解决方案中重置为正常模式,但您的另一个解决方案会将其覆盖,因此您可以在这个答案中提及它,我会要求您将您的另一篇文章引用到这个答案,以帮助其他人。