2013-02-14 1 views
0

VS2002와 함께 C#을 사용하여 WebBrowser가 포함 된 응용 프로그램을 만듭니다.Application.DoEvents()로 WebBrowser 컨트롤이 처리 할 수없는 이유는 무엇입니까?

[x] 초 동안 사용하지 않으면 내 응용 프로그램이 홈 페이지 (이 응용 프로그램은 터미널 응용 프로그램으로 설계 됨)로 돌아 가기를 원합니다. 원칙적으로 이것은 문제가되지 않지만 나는 우연히 만났습니다.

사용자가 JavaScript MessageBox를 호출하는 것과 같은 것을 클릭하면 브라우저가 "사용 중"상태로 고정됩니다. 결과적으로 모든 탐색 시도가 COM 오류 (0x800700AA)로 끝납니다.

user32.dll SendMessage 함수를 사용하여 창을 찾고 닫을 수 있습니다. 자, 내 기능이 그 지점에서 끝나면 WebBrowser는 스크립트가 창을 호출 한 모든 작업을 계속 수행하고 결국에는 사용이 중지됩니다. 여기에는 의사 코드입니다 : 이제

// This works so long as there isn't a dialog 

private void NavigateHome(){ 

webBrowser.Navigate("http://www.google.com") 

} 

// This works to close the dialog and lets the browser return as not busy 

private void NavigateHome(){ 

CloseWindows(); //Calls user32.dll 

} 

// This, again, works as long there isn't a dialog, otherwise the COM error returns 

private void NavigateHome(){ 

CloseWindows(); //Calls user32.dll 
webBrowser.Navigate("http://www.google.com") 

} 

// I thought this would be the solution, but the browser never continues processing 

private void NavigateHome(){ 

CloseWindows(); //Calls user32.dll 

while(webBrowser.isBusy){ 

Application.DoEvents(); 

} 

webBrowser.Navigate("http://www.google.com") 

} 

, 나는 "적절한"솔루션은 창을 닫은 후 DocumentCompleted 이벤트를 시청하는 것 같아요,하지만이 매우 탄력 생각하지 않습니다. 궁극적으로, 나는 그 문서에 대해 정말로 신경 쓰지 않는다. 나는 원래 페이지로 돌아가고 싶다. 누구도이 아이디어를 어떻게 진행해야합니까?

그리고 Application.DoEvents()가 예상대로 작동하지 않는 이유도 알고 싶습니다.

+0

'webBrowser'가'while' 루프에 단순히 붙어 있다고 가정합니다. 그게 바로 '바쁜'일입니다. 더 많은 코드를 보지 않고 말하기는 어렵습니다. 또한'Application.DoEvents()'를 절대로 사용하지 마십시오. – JosephHirn

+0

@Ginosaji DoEvents의 위험성을 알고 있지만, 요점은 함수가 끝나면 WebBrowser가 해제되고 자체 정렬된다는 것입니다. 그러나 그것은 DoEvents에서 발생하지는 않으며 그 이유를 이해하지 못합니다. – Dan

+0

더 이상 사용하지 않을 이벤트 처리기를 실행하려고합니까? – JosephHirn

답변

0

이 문제를 해결하기 위해 "CloseWindow()"함수를 Background Worker 스레드로 옮겼습니다. 그런 다음이 스레드는 WebBrowser (GUI 스레드에서)가 처리하지 않아도 처리량이 많지 않은 것을 반환 할 때까지 기다릴 수 있습니다.

관련 문제