Seite 1 von 1

Problem mit win32api.SendMessage

Verfasst: Samstag 27. November 2010, 22:08
von Herr Lehmann
Hallo,

ich bin gerade dabei ein WindowsProgramm unter Python anzusteuern.

Dabei habe ich es mit folgendem code versucht:

Code: Alles auswählen

copy_data_struct = struct.pack("L2P", 1000, len(command)+1, command)
info = SendMessage(handle, win32con.WM_COPYDATA, 0, copy_data_struct);
Da bekomme ich allerdings nen Error:

struct.error: cannot convert argument to long

Durchs netz hab ich dann noch eine Lösung gefunden und für mich etwas angepasst:

Code: Alles auswählen

def packData( dwData, item ):
    global cds, lpData
    lpData = array.array('c', item)
    lpData_ad = lpData.buffer_info()[0]
    cbData = lpData.buffer_info()[1]
    cds = array.array('c', struct.pack("L2P", dwData, cbData,
                                lpData_ad) )
    print cds
    return cds


info = SendMessage( hWnd, WM_COPYDATA, 0, packData( 1000, command ) ) 

So bekomme ich zwar keinen Error beim compilieren aber das Programm stürzt ab bzw. meldet einen Fehler.

Ausgangsbasis für den Code den ich haben möchte, ist dieser Perl Code:

Code: Alles auswählen

 $handle = Win32::GUI::FindWindow("app", "");
  $copy_data_struct = pack('L2P', 1000, length( $command ) + 1, $command);
				if ( $use_rush == 1 ) {	
					$info= Win32::GUI::SendMessage($handle, WM_COPYDATA, 0, $copy_data_struct);	

Gruß

Re: Problem mit win32api.SendMessage

Verfasst: Montag 29. November 2010, 22:40
von Herr Lehmann
Habe dazu auch noch funktionierenden Delphi Code aufgetan, vielleicht bringt das euch weiter:

Code: Alles auswählen

function Script(mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
  Show: Boolean; NoPause: Boolean): Integer; export; stdcall;
var
  CopyDataStruct                        : TCopyDataStruct;
  TargetWindow                          : THandle;
begin
  TargetWindow := FindWindow('app', nil);
  if IsWindow(TargetWindow) then
  begin
    CopyDataStruct.dwData := 1000;
    CopyDataStruct.cbData := strlen(Data) + 1;
    CopyDataStruct.lpData := Data;
    wCallbackWindow.fIrcHandle := mWnd;
    if bEnableCallback then
      SendMessage(TargetWindow, WM_COPYDATA, wCallbackWindow.fWindowHandle, LParam(@CopyDataStruct))
    else
      SendMessage(TargetWindow, WM_COPYDATA, 0, LParam(@CopyDataStruct));
  end;
  Result := 1;
end;



Re: Problem mit win32api.SendMessage

Verfasst: Dienstag 30. November 2010, 00:06
von BlackJack
@Herr Lehmann: Ungetestet:

Code: Alles auswählen

from ctypes import (
    cast, c_char, c_char_p, c_long, pointer, POINTER, sizeof, Structure
)


class CopyDataStruct(Structure):
    _fields_ = [
        ('number', c_long),
        ('length', c_long),
        ('data_ptr', c_char_p)
    ]
    
    def __init__(self, command):
        self.number = 1000
        self.length = len(command) + 1
        self.data_ptr = command
    
    def __str__(self):
        return cast(pointer(self), POINTER(c_char * sizeof(self))).contents.raw


def main():
    copy_data_struct = CopyDataStruct('abc')
    # SendMessage(..., str(copy_data_struct))
Wichtig ist, dass `copy_data_struct` so lange existiert wie die Daten benötigt werden.

Re: Problem mit win32api.SendMessage

Verfasst: Mittwoch 1. Dezember 2010, 17:46
von Herr Lehmann
Hat funktioniert! Vielen Dank :!: