想做一个类似于快车一样的软件,从页面上做了点击后,将网址、链接等发送到某程序中去,其中用到了ActiveX等东东,这里不细说,这里只是说说ActiveX如何将得到的数据发送给处理程序。
发送方法:
对方法的引用
[DllImport("user32.dll")]
private static extern long SendMessage(Int32 hwnd, Int32 msg,Int32 hwndFrom, ref COPYDATASTRUCT cd);
[DllImport("user32.dll")]
private static extern Int32 FindWindow(String classname, String text);
一些需要定义的常量
const int WM_COPYDATA = 0x004A;
定义结构(类外)
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
方法:
string s = this.textBox1.Text;
//定义c,是为了取得字符串中一些非英文字符的长度,比如一个中文,占两个字长。
Regex reg = new Regex("[^/x0-/xff]");
int c =0;
if(reg.IsMatch(s))
{
MatchCollection mc = reg.Matches(s);
c = mc.Count;
}
Int32 hTraceWnd = FindWindow(null,"接收方");//查找窗口时要注意,单独查找类与查找名称都不可靠。
if (hTraceWnd!=0)
{
Int32 id = 1; // magic number for
Int32 WM_COPYDATA = 0x004A; // Win32 API message id
COPYDATASTRUCT cd = new COPYDATASTRUCT();
cd.dwData = (IntPtr)id;
cd.lpData = s+"/0";//一定要加上结束标志,不加的话会得到不确定的字符。
cd.cbData = s.Length+c+1;//另外加上双字节的东西和结束符的长度
SendMessage(hTraceWnd, WM_COPYDATA, 0, ref cd);
}
接收方法:
定义常量
const int WM_COPYDATA = 0x004A;
定义结构(类外)
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)] public string lpData;
}
方法:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
//接收自定义消息 USER,并显示其参数
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
this.textBox1.Text =mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}