我已經花了幾天(或更多)試圖讓這個工作。C#使用SendMessage,問題與WM_COPYDATA
手頭的應用程序是FTPRush
,我知道有一個叫做rush_cmdline.exe
的cmd行應用程序,它使用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 example
任何啓示是極大的讚賞!
感謝,
- 弗蘭克
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);
你確定FTP Rush支持WM_COPYDATA嗎? FTPRush文檔對此消息有何評論?如果FTPRush不處理WM_COPYDATA,它將忽略該消息並且什麼都不做。 – shf301
@ sh301:它確實支持WM_COPYDATA。這是perl例子中使用的,它是'rush_cmdline.exe'使用的。 – Frank