11# -*- coding:utf-8 -*-
22from .winConst import WinConst
3+ from .wkeStruct import COPYDATASTRUCT
4+ from ctypes import (cast ,c_char_p ,py_object ,sizeof ,byref ,string_at ,create_string_buffer ,POINTER )
35import win32gui
46import win32api
7+ import json
58
6-
9+ PCOPYDATASTRUCT = POINTER ( COPYDATASTRUCT )
710class WndProcHook :
8- def __init__ (self ,webview , hwnd ):
11+ def __init__ (self ,hwnd , webview = None ):
912 self .webview = webview
1013 self .hwnd = hwnd
1114 self .msg_func_dict = {}
@@ -18,7 +21,18 @@ def add_msg_func(self,webview,hwnd,msg,msg_func):
1821 def _onWndProcCallback (self , hwnd , msg , wParam , lParam ):
1922
2023 if msg in self .msg_func_dict :
21- ret = self .msg_func_dict [msg ](self .webview ,hwnd ,wParam , lParam )
24+ argcount = self .msg_func_dict [msg ].__code__ .co_argcount
25+ ret = None
26+ if argcount == 5 :
27+ arg_vals = self .msg_func_dict [msg ].__code__ .co_varnames
28+ if arg_vals [0 ]== 'self' :
29+ ret = self .msg_func_dict [msg ](self .webview ,hwnd ,wParam , lParam )
30+ elif argcount == 4 :
31+ ret = self .msg_func_dict [msg ](self .webview ,hwnd ,wParam , lParam )
32+ elif argcount == 3 :
33+ ret = self .msg_func_dict [msg ](hwnd ,wParam , lParam )
34+ elif argcount == 2 :
35+ ret = self .msg_func_dict [msg ](wParam , lParam )
2236 if ret != None :
2337 return ret
2438 if hasattr (self ,'onWndProcCallback' ):
@@ -27,4 +41,30 @@ def _onWndProcCallback(self, hwnd, msg, wParam, lParam):
2741 return ret
2842 if msg == WinConst .WM_DESTROY :
2943 self .unhook_WndProc ()
30- return win32gui .CallWindowProc (self .oldWndProc , hwnd , msg , wParam , lParam )
44+ return win32gui .CallWindowProc (self .oldWndProc , hwnd , msg , wParam , lParam )
45+
46+ @staticmethod
47+ def value_to_msg (value ,copydate = False ):
48+ if copydate :
49+ cds = COPYDATASTRUCT ()
50+ cds .dwData = 0
51+ value = json .dumps (value ).encode ()
52+ cds .cbData = sizeof (create_string_buffer (value ))
53+ cds .lpData = c_char_p (value )
54+ return byref (cds )
55+ else :
56+ value = json .dumps (value ).encode ()
57+ return c_char_p (value )
58+ @staticmethod
59+ def msg_to_value (wParam ,lParam ,copydate = False ):
60+ if lParam != 0 :
61+ try :
62+ if copydate :
63+ pCDS = cast (lParam , PCOPYDATASTRUCT )
64+ value = string_at (pCDS .contents .lpData ).decode ()
65+ else :
66+ value = cast (lParam , c_char_p ).value .decode ()
67+ except :
68+ return
69+ value = json .loads (value )
70+ return value
0 commit comments