Я потратил несколько дней (или больше), пытаясь заставить это работать.
Под рукой находится приложение FTPRush
, и я знаю, что есть приложение строки cmd под названием rush_cmdline.exe
, которое использует SendMessage
для отправки запросов FTPRush
.
При отладке rush_cmdline.exe
я вижу lParam
, wParam
, Message
и hWnd
.
Мой код выглядит следующим образом (используя SendMessage, а не 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);
И я также попробовал другую спецификацию:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
Ручка (hWnd
) не проблема, так как это работает:
int ftprush = FindWindow("TfmRush", null);
ShowWindow(ftprush, 8);
Который (я не вставлял dllimport, так как он здесь не важен. Дайте мне знать, если хотите его увидеть) выводит окно на передний план. Также я проверил отладкой rush_cmdline.exe
. Так что ручка такая же.
Две попытки, которые обе терпят неудачу (молча):
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);
Я ожидаю, что по крайней мере второе решение сработает, так как оно очень хорошо сочетается с этим: perl пример
Любое просветление ОЧЕНЬ ценится!
Спасибо,
- откровенный
ОБНОВИТЬ:
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);
rush_cmdline.exe
. - person Frank   schedule 21.07.2011