このリンク先に1~5の方式がある。
https://mail.python.org/pipermail/python-win32/2006-August/004979.html
◆結論
リンク先の1の方式で検知できそう。これで検知できました。
from ctypes import windll from win32com.client import gencache, Dispatch import time docmod = gencache.EnsureModule('{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}', 0, 4, 0) class DocEvents(docmod.HTMLDocumentEvents2): def __init__(self, doc): docmod.HTMLDocumentEvents2.__init__(self, doc) def Ononclick(self, event): print ('onclick') ev = gencache.EnsureDispatch(event) elem = ev.srcElement print( 'tagName' , elem.tagName) print( 'id' , elem.id) #print 'innerText' , elem.innerText #print 'clientX' , ev.clientX #print 'clientY' , ev.clientY #print 'body text' , doc.body.createTextRange().text ie = Dispatch("InternetExplorer.Application") ie.Navigate('http://www.google.com') ie.Visible = 1 while ie.Busy: time.sleep(0.1) doc = ie.Document d = DocEvents(doc) windll.user32.MessageBoxW(None, 'OK!', 'URL Checker', 0x00000040)
ちなみに、上記に次を追加すると、マウスオーバーイベントも拾えるようになります。
どうやら、3050F1C5がMSHTMLそのものらしい。
def Ononmouseover(self, event): print('マウスオーバーを検知しました!')
◆過程
上記リンク先の3の方式からトライ。
from ctypes import windll from win32com.client import Dispatch, WithEvents import time class DocEvents: def Ononclick(self): print( 'onclick') ev = doc.parentWindow.event elem = ev.srcElement print( 'tagName' , elem.tagName) print( 'id' , elem.id) #print 'innerText' , elem.innerText #print 'clientX' , ev.clientX #print 'clientY' , ev.clientY #print 'body text' , doc.body.createTextRange().text ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate('http://www.google.com') while ie.Busy: time.sleep(0.1) doc = ie.Document d = WithEvents(doc, DocEvents) windll.user32.MessageBoxW(None, 'OK!', 'URL Checker', 0x00000040)
すると、手動でmakepy.pyせよといわれる。
File "C:\python\envairobot\lib\site-packages\pywin32-224-py3.6-win-amd64.egg\win32com\client\__init__.py", line 321, in WithEvents
raise TypeError("This COM object can not automate the makepy process - please run makepy manually for this object")
TypeError: This COM object can not automate the makepy process - please run makepy manually for this object
うむ、これか、、、と思って、試してみる。
d.hatena.ne.jp
(envairobot) C:\python\envairobot\Lib\site-packages\pywin32-224-py3.6-win-amd64.egg\win32com\client>python makepy.py
試してみて、3つくらい入れてみた。
それでも、同じエラーメッセージがでちゃうな。入れるものを間違っているのかな。うーむ。ということで、1の方式に戻ったところ、できました。1の方式でトライしてみましょう。
◆今後
まだ、無限ループなプログラム内で動いていないし、最初から立ち上がったIEでは動いていない。
serverless.hateblo.jp
この2方式のうちでは、pythoncom方式が違いと思うので、こちらのプログラムに組み込んで、さらなる動作確認してみます。