WinForms-어떻게 실행 C#응용 프로그램 코드가 내부에서 WebBrowser 컨트롤?

StackOverflow https://stackoverflow.com/questions/305915

  •  08-07-2019
  •  | 
  •  

문제

나는 형태를 포함하는 웹 브라우저를 제어합니다.이는 브라우저 제어 로드 중 일부에서 HTML 을 디스크에 표시합니다.하고 싶을 가질 수 있는 버튼에서 HTML access C#코드에서는 나의 형태입니다.

예를 들어,에서 버튼을 HTML 도 Close()메소드에서 형태입니다.

대상:플랫폼C#고 윈도우 폼(모든 버전)

도움이 되었습니까?

해결책

를보세요 webbrowser.objectforscripting 재산. 이를 사용하여 Google지도가 Windows Forms 응용 프로그램과 대화 할 수있었습니다.

다른 팁

나는 과거의 몇 가지 응용 프로그램에서 이것을 알 수 있습니다. 다음은 다음과 같습니다.

먼저 웹 브라우저 컨트롤에서 실행중인 JavasVCIPT에서 호출하려는 공개 메소드가 포함 된 일반 .NET 클래스 (public)를 만듭니다.

가장 중요한 것은 system.runtime.interopservices 네임 스페이스에서 comvisible (true)] 속성으로 장식해야한다는 것입니다 (IE의 JavaScript는 com 기반). 그것은 무엇이든 부를 수 있습니다. 나는 그것을 더 명확하게하기 위해 그것을 "외부"라고 불렀습니다.

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}

웹 브라우저 컨트롤이 포함 된 .NET 양식의 다음 Comvisible 클래스의 인스턴스를 작성한 다음 웹 브라우저 컨트롤 객체를 해당 인스턴스로 설정합니다.

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }

마지막으로 웹 브라우저 컨트롤에서 실행중인 JavaScript에서 Window.external 객체를 통해 .NET 메소드에 액세스하십시오. 이 경우 window.external은 실제로 위에서 만든 "외부"객체를 참조합니다 (COM 인터 로프 래퍼를 통해 간접적으로).

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}

JavaScript에서 .NET으로의 호출은 COM 인터 로프 레이어를 통과하여 기본 인터페이스의 쿼리가 발생해야합니다. 매개 변수의 마샬링 등이 발생해야합니다. 다시 말해 상대적으로 느릴 수 있으므로 루프 내에서 예를 들어 여러 번 전화를 걸면 성능 테스트를 수행하십시오.

또한 향후 참조를 위해 .NET에서 JavaScript 코드를 호출하는 것이 더 간단합니다. document.invokescript 메소드를 사용하십시오.

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });

무엇을 했는지 VB6:

  • 추가의 무리를 주문 < A>태그를 HTML 문서에서 설정,자신의 href 뭔가 의미 있는 당신처럼,'#closeform'
  • 에 BeforeNavigate 방법,주소를 확인하는 브라우저가로 이동하려고하고 그에 따라 행동한다.다음 취소를 브라우저 탐색.

Webbrowser의 탐색 이벤트에 대한 이벤트 핸들러를 추가하기 만하면됩니다.

이 이벤트는 브라우저가 다음 페이지로 탐색하기 전에 발사됩니다. 내비게이션 취소 및 코드로 호출을 포함하여 프로세스를 방해하고 원하는대로 수행 할 수 있습니다.

사용하기 쉽습니다. 내가 겪은 유일한 경고는 사후 데이터를 볼 수 없다는 것입니다. 여기에서 내 질문을 참조하십시오. 사후 사후 질문

샘플 코드는 다음과 같습니다.

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }

이것은 가능하지만 .NET에서는하지 않았습니다. 몇 년 전 웹 브라우저 컨트롤 (ActiveX)을 호스팅하는 C ++ 응용 프로그램이있었습니다. 컨트롤의 HTML에서 'out'을 ActiveX 컨트롤로 호출하여 일을하도록 할 수있었습니다.

HTML dom/javaScript는 c#에 대해 알지 못하지만 .NET에서도 마찬가지입니다. 그러나 COM 객체에 .NET 기능을 랩핑하면 C# 코드를 호출하는 COM/ActiveX 객체에서 메소드를 호출 할 수 있어야합니다.

도움이 되었기를 바랍니다.

나는 몇 년 전에 이것을했고 여기에 블로그를 작성했습니다.

http://matthewskelton.wordpress.com/2007/04/21/calling-javaScript-from-c/

구체적으로 사용할 수 있습니다 Type.InvokeMember() C#에서 JavaScript를 호출하려면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top