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