2009-10-13 6 views
1

Google 프로그램에서 TCppWebBrowser 구성 요소를 일종의 chatwindow로 사용하지만 TCppwebrowser가 IExplorer에서 열리는 클릭 링크 인 IExplorerengine을 사용하고 있기 때문에. 내가 가지고있는 한 가지 아이디어는 Onbeforenavigate2에서 Shell.execute를 탐색하는 것을 취소하는 것이지만 어디에서 처리 할 수있는 Windows 메시지와 같은 좀 더 우아한 솔루션을 원하거나 이벤트 또는 무언가를 원하고 있습니다.시스템 기본 브라우저에서 TCppWebBrowser 구성 요소의 링크를 여는 방법

+1

당신의 아이디어는 우아한 솔루션입니다 :

TCppWebBrowser 더 코드의 경우, 내가 찾은이 링크를 참조하십시오. 기본 액션을 바꾸기를 원한다면 콜백이 있으므로 사용하는 것이 합리적입니다. – MSalters

+1

Qwark, 당신은 "당신이 처리 할 수있는 사건을 기대하고있다"고 말했습니까? OnBeforeNavigate2는 무엇이라고 생각하십니까? –

+0

Rob : 내 질문을 편집 했으니 이해가되지 않았다. 지금은 알았다. P – Qwark

답변

7

TCppWebBrowser가 Delphi의 TWebBrowser와 같은 것으로 가정하면 아래 코드와 같은 것이 좋습니다.

OnBeforeNavigate2 event은 TWebBrowser가 새 URL로 이동하기 전에 시작됩니다. 당신이하는 일은 그 탐색을 취소하고, redirect the URL with ShellExecute to an external application (Windows에서 구성된 기본 웹 브라우저입니다)입니다.

아래의 코드를 작동 시키려면 양식을 두 번 클릭 한 다음 FormCreate 이벤트 메소드 내용을 입력하십시오. 그런 다음 TWebBrowser를 놓고 객체 속성의 이벤트 페이지로 이동 한 다음 OnBeforeNavigate2 이벤트를 두 번 클릭하고 해당 코드를 입력하십시오.

재미있게 즐기세요! 그것은 C++에서이 아니다 제외 제론 준

unit MainFormUnit; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, OleCtrls, SHDocVw; 

type 
    TForm1 = class(TForm) 
    WebBrowser1: TWebBrowser; 
    procedure FormCreate(Sender: TObject); 
    procedure WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; 
     var URL, Flags, TargetFrameName, PostData, Headers: OLEVariant; var Cancel: 
     WordBool); 
    private 
    RedirectUrls: Boolean; 
    end; 

var 
    Form1: TForm1; 

implementation 

uses 
    ShellAPI; 

{$R *.dfm} 

procedure TForm1.Create(Sender: TObject); 
begin 
    WebBrowser1.Navigate('http://www.stackoverflow.com'); 
    RedirectUrls := True; 
end; 

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: 
    IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OLEVariant; 
    var Cancel: WordBool); 
var 
    UrlString: string; 
begin 
    if not RedirectUrls then 
    Exit; 
    UrlString := URL; 
    ShellExecute(Self.WindowHandle, 'open', PChar(UrlString), nil, nil, SW_SHOWNORMAL); 
    Cancel := True; 
end; 

end. 
2

--jeroen

은 오른쪽, 그리고 난 당신이 도움이 사용하고있는 언어의 예를 들어있을 거라고 생각합니다. TCppWebBrowser 구성 요소는 TWebBrowser 구성 요소와 유사하며 동일한 이벤트가 있습니다. (당신은하지만, 내부의 일부에 액세스하려고 할 때 더 복잡해진다.)

여기

는 OnBeforeNavigate2 방법의 편집 된 버전의 내가 사용

 
void __fastcall TMyForm::CppWebBrowserBeforeNavigate2(TObject* /*Sender*/, 
     LPDISPATCH /*pDisp*/, Variant* URL, Variant* /*Flags*/, Variant* /*TargetFrameName*/, 
     Variant* /*PostData*/, Variant* /*Headers*/, VARIANT_BOOL *Cancel) 
{ 
    UnicodeString strURL(URL->operator UnicodeString()); 
    if (strURL != m_strWebPage && strURL != L"about:blank") { // if navigating somewhere else, ie the user clicked a link 
     *Cancel = true; 
     if ((int)::ShellExecute(NULL, L"open", strURL.c_str(), NULL, NULL, SW_SHOWNORMAL) <= 32) { 
      MyMessageBox(L"There was an error opening the link '" + strURL + L"'."); 
     } 
    } 
} 
 

이를 제외하고, 웹 브라우저 내에서 탐색을 취소 about:blank (제어 할 수있는 합법적 인 페이지가 아닌 경우 해당 비트를 제거 할 수 있음) 및 잠길 원하는 URL 인 m_strWebPage. 이 검사를 좀 더 유연하게 만들면 특정 도메인의 아무 곳이나 탐색하고 다른 창에서 다른 도메인에 대한 링크를 열 수 있습니다.

이 코드는 UnicodeStringL 문자열 접두사를 사용하기 때문에 C++ Builder 2009/2010 용으로도 작성되었습니다. 어떤 버전을 사용하고 있는지 말하지는 않지만, 2007을 사용 중이거나 대신 WideString으로 전송하려는 경우 당신이 TCppWebBrowser의 "webNewWindow2"당신이 열 TCppWebBrowser에있는 링크를 처리하지 않은

건배,

데이비드 사실

+0

고마워!내 C++은 약간 녹슬어서, 델파이 예제는 :-) –

+0

감사합니다. 나는 C++ 빌더에서 프로그램을 작성하지만 아무런 문제없이 Delphi를 읽었습니다. 그래서 Pluimers 씨의 솔루션은 훌륭합니다. 그리고 제가 한 일종의 것입니다. – Qwark

관련 문제