C# en utilisant la fonction SendMessage, problème avec WM_COPYDATA

J'ai passé quelques jours (ou plus) en essayant d'obtenir que cela fonctionne.

L'application à la main est FTPRush, et je sais qu'il existe une ligne de cmd application appelée rush_cmdline.exe qui utilise SendMessage pour envoyer des demandes de FTPRush.

De débogage de l' rush_cmdline.exe je peux voir lParam, wParam, Message et hWnd.

Mon code est comme suit (en utilisant la fonction SendMessage, pas 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);

Et j'en ai essayé un autre spécification également:

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

La poignée (hWnd) n'est pas le problème, tant que cela fonctionne:

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

Qui (je n'ai pas de pâte de la dllimport que ce n'est pas important ici. Laissez-moi savoir si vous souhaitez voir) apporte la fenêtre à l'avant. Aussi, j'ai vérifié par le débogage rush_cmdline.exe. Si la poignée est la même.

Deux tentatives qui ne (silencieusement):

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

Je m'attends au moins la 2ème solution, car elle correspond assez bien à ce: perl exemple

Toute l'illumination est GRANDEMENT apprécié!

Merci,

  • Frank

Mise à JOUR:

string msg = "RushApp.FTP.Login('backup','',0);
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);
"
; 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);
Êtes-vous sûr que FTP Rush prend en charge WM_COPYDATA? Ce qui ne l'FTPRush documentation dire à propos de ce message? Si FTPRush ne gère pas les WM_COPYDATA il va simplement ignorer le message et de ne rien faire.
il prend en charge WM_COPYDATA. C'est celui utilisé dans le perl exemple, et c'est celui utilisé par rush_cmdline.exe.

OriginalL'auteur Frank | 2011-07-21