tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルACCESS2010(VBA)のWebブラウザーコントロールの右クリック制御について
記事No16245
投稿日: 2016/06/26(Sun) 11:51
投稿者あーちゃ
いつも参考にさせて頂いております。
VBではなくACCESS2010のVBAについての質問なのですが、
お分かりになる方がいらっしゃればと思い、投稿させて頂きます。

質問内容ですが、フォームに貼り付けたWebブラウザーコントロールについて、になります。
このWebブラウザーコントロールにリンクが含まれたhtmlを表示させているのですが、
VBA側から右クリックの制御を行う方法を探していたところ、
VB向けのやり方で、単に右クリックを禁止させる方法は見つかって実践も出来ました。

そこで、次に、クリックした場所に応じて処理を分ける、
例えばリンク上でした時と、テキストや余白上でした時などで別々のフォームを出す、
という処理を行いたいと思ったのですが、ここで躓いてしまいました。
Microsoftが提供されていたとされるWBCustomizer.dllを使用する、とか、
有志の方が作られたタイプライブラリを使用するという方法が散見されましたが
入手することが出来ないようです。

なお、javascriptを用いることも考えましたが、今回はVBAで処理をしたいと思います。
何かいい方法をご存じの方がいらっしゃいましたら、教えて頂ければ幸いです。

[ツリー表示へ]
タイトルRe: ACCESS2010(VBA)のWebブラウザーコントロールの右クリック制御について
記事No16246
投稿日: 2016/06/26(Sun) 16:15
投稿者魔界の仮面弁士
> Microsoftが提供されていたとされるWBCustomizer.dllを使用する、とか、
DLL そのものは提供されていなかった気がします。
WBCustomizer.dll を作るためのサンプルコード(VC++ 5.0)なので、
自分でビルドする必要があったような…うろ覚え。

有志がビルドした物であれば、Microsoft 非公式で何箇所かにあるようですが、未確認です。


> 有志の方が作られたタイプライブラリを使用するという方法が散見されましたが
> 入手することが出来ないようです。
ライブラリを用意するのがもっとも簡単なのでしょうけれどね。

技術的には、COM の低レベル API を呼び出すことで、IDocHostUIHandler の実装を
参照設定せずに呼び出すことが出来るかもしれませんが、煩雑なので現実的では無いでしょうね。
そうしたサンプルはネット上に無さそうですし、独力での実装が必要になってしまうはず。


> なお、javascriptを用いることも考えましたが、今回はVBAで処理をしたいと思います。
理由が良く分かりませんが、
 Private WithEvents Doc As MSHTML.HTMLDocument
などとして、HTML DOM のイベントバブルを辿るのも駄目なのでしょうか?
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200407/04070038.txt
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=12469&page=0
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda2_403_2.html


※注:一つ目の URL にある「プロシージャ属性」を指定するための画面は、
 VBA には用意されていません。そのため、一旦 .cls ファイルとしてエクスポートしてから
 メモ帳等で属性を追加し、再度インポートしなおすことで対処してみてください。
 http://note.phyllo.net/?eid=1106050


※注:三つ目の URL にある UserControl は、Access では使えません。
 このサンプルでは配列として各所のイベントを拾う形にしていますが、
 単一の上位要素でイベントバブルを辿ることで代用できないか試してみてください。


> 何かいい方法をご存じの方がいらっしゃいましたら、教えて頂ければ幸いです。
「いい方法」と言えるかどうかは分かりませんが、たとえば Form の Timer イベントで
現在のマウス座標を定期的に調べて(GetCursorPos API など)、
そこからアクセシビリティ オブジェクトを得て判断するのはどうでしょう。

UIAutomationClient ライブラリ(UIAutomationCore.dll) を参照設定して
CUIAutomation オブジェクト → ElementFromPoint メソッドと辿るとか、
あるいは古い方法ですが、AccessibleObjectFromPoint API あたりから
IAccessible を得るとか。

[ツリー表示へ]
タイトルRe^2: ACCESS2010(VBA)のWebブラウザーコントロールの右クリック制御について
記事No16247
投稿日: 2016/06/26(Sun) 19:11
投稿者あーちゃ
魔界の仮面弁士様、レスありがとうございます。

> DLL そのものは提供されていなかった気がします。
> WBCustomizer.dll を作るためのサンプルコード(VC++ 5.0)なので、
> 自分でビルドする必要があったような…うろ覚え。

まさに魔界の仮面弁士様が、そう書かれている過去ログがありまして、目は通しておりました。
C++のコンパイラもないと出来ない、持ってる方に頼むしかない、とおっしゃってたと思います。

> 「いい方法」と言えるかどうかは分かりませんが、たとえば Form の Timer イベントで
> 現在のマウス座標を定期的に調べて(GetCursorPos API など)、
> そこからアクセシビリティ オブジェクトを得て判断するのはどうでしょう。
>
> UIAutomationClient ライブラリ(UIAutomationCore.dll) を参照設定して
> CUIAutomation オブジェクト → ElementFromPoint メソッドと辿るとか、
> あるいは古い方法ですが、AccessibleObjectFromPoint API あたりから
> IAccessible を得るとか。

UIAutomationClient を使用した方法も考えたのですが、
環境によってなのか、参照設定を行う際にエラーが発生するようでしたので、
(実際、私の環境では UIAutomationCore.dll の場所がデスクトップになってます)
作成物を配布するため、そのことを考慮すると選択できませんでした。



ご提示頂いた 3つめの方法を試し、リンクをクリックしたらVBAに処理を渡す、という処理には成功しました。

> 理由が良く分かりませんが、
>  Private WithEvents Doc As MSHTML.HTMLDocument
> などとして、HTML DOM のイベントバブルを辿るのも駄目なのでしょうか?
> http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200407/04070038.txt
> http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=12469&page=0
> http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda2_403_2.html

全く javascript を使えない、という訳ではないのですが、単純に用いない方法があれば
VBA のみで実装してみたい、というのが本当のところでした。
(html を毎度生成していて、付随するコードで煩雑になるのを避けたいというのも少しあります)
ただ、仰る通り、javascriptのイベントバブルを辿らない限りは、
今の私の技量では実現できなさそうですので、考え直したいと思います。

先の目途も立ちそうですので、ここでクローズさせて頂きます。
分かりやすいご説明をして下さり本当にありがとうございました。

[ツリー表示へ]