문제

ActiveX Webbrowser 컨트롤이 포함 된 Windows 응용 프로그램이 있습니다. 이 응용 프로그램의 정기적 인 작동의 일부로 ActiveX Webbrowser 컨트롤에서 표시되는 페이지로 수정됩니다. 이러한 수정의 일부에는 ActiveX WebBrowser에로드되는 웹 페이지에서 JavaScript 변수를 설정하는 것이 포함됩니다.

C# 내 에서이 변수를 초기화해야합니다 (원래 VB6 코드는 값을 초기화했습니다). 이 변수의 값은 com-visible 클래스 객체입니다.

그러나 단순화를 위해 문자열 값을 설정하는 데 문제가 줄었습니다. 우리의 원래 페이지는 프레임 등이 포함되지만 동일한 문제는 다음과 같은 페이지에서 발생합니다.

<HTML>
 <HEAD>
  <TITLE>Test</TITLE>
  <SCRIPT type="text/javascript">
   var field = 'hello world';
  </SCRIPT>
 </HEAD>
 <BODY>
   <input type="button" value="See field" onclick="javascript:alert(field);"/>
 </BODY>
</HTML>

우리는 액세스하고 싶습니다 필드 변수 및 값을 할당합니다. VB6에서 이에 대한 코드는 매우 간단했습니다.

doc.Script.field = 'newValue'

그러나 C#에서는 다음과 같은 다른 트릭에 의지해야했습니다.

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);

페이지의 요점은 C#에 의해 변수가 올바르게 할당되었는지 여부를 테스트하는 것입니다. 버튼을 클릭하면 C#에 의해 새 값이 주입 된 모든 것을 얻을 수 있습니다. 예를 들어, 페이지의 버튼을 클릭하면 "NewValue"라는 경고가 표시됩니다.

처음으로 작동하지만 페이지를 다시로드하면 작동하지 않습니다. 후속 통화에서는 변수의 값을 설정할 수 없습니다. field.

이 유형의 작업을 수행 한 경험이 있습니까?

도움이 되었습니까?

해결책 3

이 두 기사는 우리의 문제에 대한 해결책을 찾는 데 도움이되었습니다. 그들은 알아야 할 것이 무엇인지에 대한 기본 사항을 설명합니다.

C#을 사용한 Microsoft 웹 브라우저 자동화

MSHTML 고급 호스팅 인터페이스 사용

그래서 우리는 Dochostuihandler 인터페이스를 구현하여 Uihandler를 설정하여 JavaScript의 메소드를 참조 할 수있었습니다.

다른 팁

나는 당신이 찾고있는 것이 eval() JavaScript의 메소드. 다음과 같이 C#에서 호출 할 수 있습니다.

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

이 코드는 평가됩니다 "1 + 2" 그리고 반환 "3". 당신이 들어가면

InvokeScript("eval", new String[] {"varName = 3"})

파일에 전 세계적으로 표시되면 변수를 3으로 지정할 수 있습니다.

WebBrowser 컨트롤을 사용하는 경우 AC# 객체를 ObjectForscripting 속성에 할당 할 수 있습니다.http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

그런 다음 JavaScript에서 window.external을 사용하여 JavaScript에서 C# 객체와 상호 작용할 수 있습니다.

어떤 이유로 ActiveX 버전을 사용하는 경우 JavaScript : URL을 전달하여 변수를 프로그래밍 방식으로 설정하거나 WebService/ Database/ File을 사용하여 스크립트를 동기화하거나 제안한 메소드를 사용하여 스크립트를 동기화 할 수 있습니다.

우리가 사용하는 일반적인 방법은 페이지에 숨겨진 텍스트 입력 상자 (ASP.NET 제어 버전)를 추가하는 것입니다. 이렇게하면 C# CodeBehind에서 값을 쉽게 설정하고 클라이언트 측 JavaScript에서 값을 읽을 수 있습니다 (물론 그 반대로).

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