【python】MSHTML

◆ctypes
こういうインポートができるんだから、MSHTMLできるでしょう。

from mshtml import IHTMLDocument2, IHTMLElement

Connecting to running instances of IE on your computer « Python recipes « ActiveState Code

上記ソース内で、try/exceptを使っている部分があります。
これは、DOM(下の例ではIHTMLDocumnet2のポインタである"doc")が見つからなかった場合にプログラムがエラー出すことを想定しているのでtry/exceptなんです。

                try:
                    hret = htmlDisp.QueryInterface(byref(IHTMLDocument2._iid_), byref(doc))
                    #print "doc", doc
                except:
                    pass


IHTMLElementがput_onclick()を持っているわけです。
IHTMLElement

そこにIDispatch(もしくはPyIDispatch)でアクセスできれば良いわけだな。

とうとう、C++のときのようなイベント受信ができちゃうかな?
http://eternalwindows.jp/browser/mshtml/mshtml07.html


PyIdispatchの説明は、次の2つです。
http://timgolden.me.uk/pywin32-docs/PyIDispatch__Invoke_meth.html
https://www.oreilly.com/library/view/python-programming-on/1565926218/ch12s03s06.html

cytpesでtlbファイルを変換しようと思うのだが、、、MSHTMLpythonに変換するためのreadtlb.pyが見つからない。。。
しかも、readtlb.pyについてのWeb記事が極めて少なかったり、古いのしかヒットしなかったり、ちょっと心配になってきた。

◆comtypes
こんなソースコードがgitに落ちていた。。。
github.com

もしかして、comtypes.genを使うのか?

from comtypes.client import GetModule

GetModule('mshtml.tlb')
GetModule('oleacc.dll')

ctypesのGetModuleの使い方は、こちらを参考にしました。
qiita.com

以下の場所に、mshtml.pyができているのが確認できます。

C:\python\envselenium\Lib\site-packages\comtypes-1.1.7-py3.6.egg\comtypes\gen

さぁ、次のスクリプトMSHTMLの持っているメソッドやメンバーを確認しましょう!

from comtypes.gen import MSHTML

for element in dir(MSHTML):
	print(element)

f:id:urbanplanner:20181110090407p:plain
これで、IHTMLDocument3が使えるようになるぞ!

◆ctyepsのこんな使い方
windllとか、こんな感じに使うこともできるらしい。凄いよ。
komaken.me

例えば、メッセージボックスを出してみる!

from ctypes import *
user32 = windll.user32
user32.MessageBoxW(None, u'メッセージぼっくす!', u'メッセージボックス!', 0x00000040)