struct module usage

B

BW Glitch

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)
#####

I've tried almost every combination on the struct format.

TIA,

--
Andres Rosado
Email: (e-mail address removed)
ICQ: 66750646
AIM: pantear
Homepage: http://andres980.tripod.com/

We make the standards and we make the rules.
-- Standards; The Jam
 
M

Mark Hammond

BW said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,151
Latest member
JaclynMarl
Top