C# mithilfe von SendMessage -, problem mit WM_COPYDATA

Ich verbrachte ein paar Tage (oder mehr) versucht, diese zu arbeiten.

Die Anwendung bei der hand ist FTPRush, und ich weiß, es ist eine cmd-line-Anwendung namens rush_cmdline.exe verwendet SendMessage Anfragen zu senden FTPRush.

Vom debugging der rush_cmdline.exe ich sehen kann lParam, wParam, Message und hWnd.

Mein code ist wie folgt (mithilfe der SendMessage, nicht SendMessageW):

[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
[DllImport("USER32.DLL", EntryPoint= "SendMessage")]
public static extern IntPtr SendMessage(int hWnd, int Msg, int wParam, IntPtr lParam);

Und ich habe versucht, eine andere Spezifikation auch:

[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

Den Griff (hWnd) ist nicht das problem, wie das funktioniert:

int ftprush = FindWindow("TfmRush", null);
ShowWindow(ftprush, 8);

Welche (ich habe nicht fügen Sie die dllimport wie es ist hier nicht wichtig. Lassen Sie mich wissen, wenn Sie möchten, um es zu sehen) bringt das Fenster nach vorne. Auch habe ich überprüft, indem debugging rush_cmdline.exe. Also der Griff ist der gleiche.

Zwei Anläufe, die beide fehlschlagen (im hintergrund):

public const Int32 WM_COPYDATA = 0x4A;
string msg = "RushApp.FTP.Login('backup','',0); ";
//1
byte[] array = Encoding.UTF8.GetBytes((string)msg);
int size = Marshal.SizeOf(array[0]) * array.Length + Marshal.SizeOf(array[0]);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(array, 0, ptr, array.Length);
Marshal.WriteByte(ptr, size - 1, 0);
SendMessage(ftprush, WM_COPYDATA, 0, ptr);

//2
public struct COPYDATASTRUCT
{
   public IntPtr dwData;
   public int cbData;
   [MarshalAs(UnmanagedType.LPStr)]
   public string lpData;
}

COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = msg;
cds.cbData = sarr.Length + 1;
SendMessage(ftprush, WM_COPYDATA, 0, ref cds);

Ich würde erwarten, dass zumindest die 2. Lösung zu arbeiten, wie es passt ziemlich gut dazu: perl-Beispiel

Jede Aufklärung SEHR dankbar!

Dank,

  • Frank

UPDATE:

string msg = "RushApp.FTP.Login('backup','',0);\0";
var cds = new COPYDATASTRUCT
{
            dwData = new IntPtr(3),
            cbData = msg.Length + 1,
            lpData = msg
};
IntPtr ftprush = FindWindow("TfmRush", null);
SendMessage(ftprush, WM_COPYDATA, IntPtr.Zero, ref cds);
Sind Sie sicher, dass die FTP Rush ist unterstützt WM_COPYDATA? Was bedeutet die FTPRush Dokumentation sagen über diese Nachricht? Wenn FTPRush nicht handhaben WM_COPYDATA es wird einfach die Meldung ignorieren und nichts tun.
es unterstützt WM_COPYDATA. Es ist in der perl-Beispiel, und es ist die einzige von rush_cmdline.exe.

InformationsquelleAutor Frank | 2011-07-21

Schreibe einen Kommentar