How can I work with pointers?
Darrell
news at dorb.com
Wed May 9 23:37:20 EDT 2001
Thanks Neil!
calldll did the trick, now to figure out how this Director thing works :)
Get calldll built for Python21 here ==> http://ezwiki.com/python
--Darrell
#######################################################
import time, calldll
from win32api import *
from win32gui import *
import win32api, win32gui, win32con, struct, array
"""
typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
"""
copyDataStruct="""IIP"""
"""32bit pointer, count, void pointer"""
class MainWindow:
def __init__(self):
self._msgs=[]
self._ar=[]
self._scite=[]
id=RegisterWindowMessage("SciTEDirectorInterface")
message_map = {
id:self.OnDirector,
win32con.WM_COPYDATA:self.OnDirector1
}
# Register the Window class.
wc = WNDCLASS()
hinst = wc.hInstance = GetModuleHandle(None)
wc.lpszClassName = "SciteDirector test"
wc.lpfnWndProc = message_map # could also specify a wndproc.
classAtom = RegisterClass(wc)
# Create the Window.
style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
self.hwnd = CreateWindow( classAtom, wc.lpszClassName, style, \
0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
0, 0, hinst, None)
UpdateWindow(self.hwnd)
self.registerDirector()
def packMsg(self, msg):
# Don't want ar to go away while being sent to another window
print 'Msg out:', msg
ar=array.array('c',msg)
self._ar.append(ar)
msg=ar.buffer_info()
cds = struct.pack(copyDataStruct,0, msg[1],msg[0])
cds = array.array('c', cds)
cds = cds.buffer_info()
return cds
def registerDirector(self):
SDI = win32api.RegisterWindowMessage("SciTEDirectorInterface")
w = win32gui.GetWindow(win32gui.GetDesktopWindow(),win32con.GW_CHILD
)
cds = self.packMsg(":%s:macroenable:1"%self.hwnd)
while (w):
if (SDI == win32api.SendMessage(w, SDI, 0, 0)):
#Replied with same SDI code so should
#understand SDI's version of WM_COPYDATA
win32api.SendMessage(w, win32con.WM_COPYDATA, self.hwnd ,
cds[0])
self._scite.append(w)
try:
time.sleep(0)
w = win32gui.GetWindow(w, win32con.GW_HWNDNEXT)
except:
w = None
cmd="""
:%(hwnd)s:askfilename:
:%(hwnd)s:property:xyz=123
:%(hwnd)s:enumproperties:base:
:%(hwnd)s:find:win32api:
:%(hwnd)s:macrolist:
"""%{'hwnd':self.hwnd}
self.perform(cmd)
def perform(self, cmd):
cds = self.packMsg(cmd)
for w in self._scite:
win32api.SendMessage(w, win32con.WM_COPYDATA, self.hwnd ,
cds[0])
def OnDirector(self, hwnd, msg, wparam, lparam):
print 'OnDirector', wparam, lparam
if lparam == 0:
return
sz = struct.calcsize(copyDataStruct)
s = calldll.read_string(lparam, sz)
dwData, cbData, lpData = struct.unpack(copyDataStruct, s)
s = calldll.read_string(lpData, cbData)
print 'S:',s
def OnDirector1(self, hwnd, msg, wparam, lparam):
print 'OnDirector1'
sz = struct.calcsize(copyDataStruct)
s = calldll.read_string(lparam, sz)
dwData, cbData, lpData = struct.unpack(copyDataStruct, s)
s = calldll.read_string(lpData, cbData)
print 'S:',s
def main():
w=MainWindow()
while 1:
if PumpWaitingMessages():
break
time.sleep(0.1)
if __name__=='__main__':
main()
################## output
Msg out: :1115962:macroenable:1
OnDirector 0 0
Msg out:
:1115962:askfilename:
:1115962:property:xyz=123
:1115962:enumproperties:base:
:1115962:find:win32api:
:1115962:macrolist:
OnDirector1
S: :1115962:filename:E:\\scite\\scite\\src\\SciTEBase.cxx
OnDirector1
S: :1115962:filename:E:\\scite\\director.py
OnDirector1
S: :1115962:filename:E:\\scite\\wscite\\scintilla.iface
More information about the Python-list
mailing list