◆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ファイルを変換しようと思うのだが、、、MSHTMLをpythonに変換するための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)
これで、IHTMLDocument3が使えるようになるぞ!
◆ctyepsのこんな使い方
windllとか、こんな感じに使うこともできるらしい。凄いよ。
komaken.me
例えば、メッセージボックスを出してみる!
from ctypes import * user32 = windll.user32 user32.MessageBoxW(None, u'メッセージぼっくす!', u'メッセージボックス!', 0x00000040)