struct module usage

Mark Hammond mhammond at skippinet.com.au
Sun Nov 30 19:12:59 EST 2003


BW Glitch wrote:

> Hi!
> 
> I'm trying to send a message from a Python script to a Scite window via
> win32gui.SendMessage() I'm trying to pack the commands using the struct
> module. However, I can't figure out why Scite isn't responding as I
> expect. The SendMessage is returning 0.
> 
> I've searched Google and haven't found anything that would help me.
> There was a discussion about this same thing about 2 years ago and the
> poster solved the problem using calldll. I checked last night and
> calldll is available only for Python 2.1, while I'm using 2.3.
> 
> Here's a snippet from the code:
> 
> #####
> import win32api, win32gui, win32con
> import sys
> import struct
> 
> SDI = win32api.RegisterWindowMessage("SciTEDirectorInterface");
> w = win32gui.GetWindow(win32gui.GetDesktopWindow(),win32con.GW_CHILD)
> 
> while w:
>     res = 0;
>     res = win32gui.SendMessageTimeout(w, SDI, 0, 0,
> win32con.SMTO_NORMAL, 1000)
>     if res[1] != SDI:
>         w = win32gui.GetWindow(w, win32con.GW_HWNDNEXT)
>     else:
>         break
> n = len("goto:20") + 1
> s = struct.pack(`n` + "sii", "goto:20,3", 9, 0)
> 
> res = win32gui.SendMessage(w, win32con.WM_COPYDATA, s, SDI)
> #####

Are you sure you are sending the correct message with the correct 
params?  The Windows doc for WM_COPYDATA say wparam should be a hwnd, 
and lparam should be the COPYDATASTRUCT.  It appears you are sending the 
struct in wparam, and a custom message integer as wparam.

Further, the COPYDATASTRUCT contains pointers, not char arrays.  Your 
struct code will need to be more complicated.  Something like:

import struct, array
int_buffer = array.array("L", [0])
char_buffer = array.array("c", "the string data")
int_buffer_address = int_buffer.buffer_info()[0]
char_buffer_address, char_buffer_size = char_buffer.buffer_info
copy_struct = struct.pack("pLp",  # dword *, dword, char *
                           int_buffer_address,
                           char_buffer_size, char_buffer_address)
# find target_hwnd somehow.
win32gui.SendMessage(w, WM_COPYDATA, target_hwnd, copy_struct)

Mark.





More information about the Python-list mailing list