想做一個類似於快車一樣的軟件,從頁面上做了點擊後,將網址、鏈接等發送到某程序中去,其中用到了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;
}
}