サーバレス練習帳

着眼大局着手小局

【python】IEのクリックを検知する

このリンク先に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つくらい入れてみた。

f:id:urbanplanner:20181127010358p:plain

f:id:urbanplanner:20181127010412p:plain

f:id:urbanplanner:20181127010420p:plain

それでも、同じエラーメッセージがでちゃうな。入れるものを間違っているのかな。うーむ。ということで、1の方式に戻ったところ、できました。1の方式でトライしてみましょう。

◆今後
まだ、無限ループなプログラム内で動いていないし、最初から立ち上がったIEでは動いていない。
serverless.hateblo.jp
この2方式のうちでは、pythoncom方式が違いと思うので、こちらのプログラムに組み込んで、さらなる動作確認してみます。