Problem mit win32api.SendMessage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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ß
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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;


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.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Hat funktioniert! Vielen Dank :!:
Antworten