flashのハンドルを取得してみよう。
執筆:2011.10.19
編集:2011.10.19
TWebBrowser.HWNDを取得する方法 (メモ: その2)
flashのハンドルを取得してみよう。
【方法1】 : Tag名からリストアップする
var
H : THandle;
i : Integer;
v_Doccument, v_elems , v_attr : Variant;
s : string;
begin
v_Doccument := WebBrowser1.Document;
if VarIsClear(v_Doccument)
or
('Internet Explorer_Server'
<> GetClassNameText(GetWindowHandleFromIDispatch(v_Doccument)))
then
begin
Exit;
end;
v_elems := v_Doccument.getElementsByTagName('OBJECT');
if Not VarIsClear(v_elems)
and (v_elems.length > 0) then
begin
s := 'count: '+IntToStr(v_elems.length) + sLineBreak;
for i := 0 to v_elems.length -1 do
begin
v_attr := v_elems.Item(i).getAttribute('CLASSID');
if Not VarIsClear(v_attr)
and (VarToStr(v_attr)
= 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000')
then
begin
s := s + v_attr + sLineBreak;
H := GetWindowHandleFromIDispatch(v_elems.Item(i));
s := s + ' HWND: ' + IntToStr(H) + sLineBreak + sLineBreak;
end;
end;
ShowMessage(s);
end;
end;
|
【方法2】 : 子Windowから探す
flashオブジェクトが htmlの
最上位に貼り付けられている場合の例です。
※iframeなどに入っている場合は、下位階層まで追いかける必要があります。
※単一のflashが htmlに張り付いている場合。
function SearchFlashHandle(p_hwnd : HWND) : HWND;
var
c_hwnd : HWND;
begin
Result := 0;
c_hwnd := GetWindow(p_hwnd, GW_CHILD );
while (c_hwnd > 0) do
begin
// ClassName[MacromediaFlashPlayerActiveX]
if (Pos('MacromediaFlashPlayerActiveX',
GetClassNameText(c_hwnd)) = 1) then
begin
Result := c_hwnd;
break;
end;
c_hwnd := GetWindow(c_hwnd, GW_HWNDNEXT );
end;
end; |
使用例 : SetFocusする。
h := GetWindowHandleFromIDispatch(WebBrowser1.Document);
flash_handle := SearchFlashHandle(h);
if (flash_handle > 0) then
Windows.SetFocus(flash_handle);
|
GetWindowHandleFromIDispatch関数については、
TWebBrowser.HWNDを取得する方法 (メモ: その1)
に書いてあります。
TWebBrowserで、どうしても入力フォーカスを当てたい際に役に立ちます。
flash以外の他のオブジェクトも同様に応用することができます。
さようなら Delphi
レッツゴー ドットネット
それいけ ドットネット
それいけ C#
C#で WebBrowserを使ってみよう(その1)
執筆:2011.10.15
編集:2011.10.16
Delphiで作ると
実行ファイルが大きくなるし、Tabで WebBrowserコ ントロール内に移動できないので
さぁ C#だー
はっはっはっ!
って 試験動作させると
瞬時に ずっこけました。
OnNewWindowで、Dispatchが設定したかったのです。
他にもいっぱいあるのですけど
NewWindowでDelphi相当の機能が実装されていないのです。
開くURLも取得できないし、Dispatchも設定できないなんて、酷い(ひどい)話です。
.Netには、なんの嫌がらせか知りませんが、本来つけておくべきイベントがたくさんないのです。
なんでもかんでも
新しいWindowで開くで、IEに送るのでは、WebBrowserを内蔵する意味がほとんどないでしょ。
(※IEに送るとセッションCookie?が引き継がれないから問題なんです。)
ということで、
.NetのWebBrowserを拡張して本来あるべきイベントを追加して対処しました。
|
private void exWebBrowser1_NewWindow3(
object sender,
WebBrowserExtendedNewWindow3EventArgs e)
{
// メモ
// (1)e.pDisp に設定しない。新しいIEとして開く。
// (2)e.pDisp を設定する。指定したWebBrowserで開く。
// ※同じWebBrowserでは、e.pDispは、動作しない。
// (3)同じWebBrowserで開く。キャンセルNavigateを呼ぶ。
// ※POSTなどが失われるので注意。
// MessageBox.Show((string) e.URL);
// open as self WebBrowser
// e.Cancel = true; exWebBrowser1.Navigate((string) e.URL);
// open as new WebBrowser
// e.pDisp = exWebBrowser2.ActiveXInstance;
} |
|
// using System.Runtime.InteropServices;
public event EventHandler<WebBrowserExtendedNewWindow3EventArgs> NewWindow3;
protected void OnNewWindow3( ... 省略
..... 省略
[ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
TypeLibType(TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
[DispId(273)]
void NewWindow3(
[In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object pDisp,
[In, Out] ref bool cancel,
[In] ref object flags,
[In] ref object URLContext,
[In] ref object URL);
}
|
|
読者に作る機会を与え、動作原理を理解させるために
あえて、完全なコードは開示していません。
不足分は、参考サイトを見ながら完成させましょう。
|
参考にした フォーラム が型とか ウソ書いていたので
少し手間だったヨ。
◎よくできました
とりあえず、目的の動作をするようにしたのでので「よし」としよう。
【参考サイト】
- webBrowserで別のウインドウで開くときの開く先のURLの取得法
とその中のリンク記事
(VSUG フォーラム → .NET 開発 → Visual C# → webBrowserで別のウインドウで開くときの開く先のURLの取得法)
- MSDN Library for Visual Studio 2008
・CreateSink メソッド (使用例)
・他