應用程序間發送消息 c# SendMessage WM_COPYDATA

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

    }

   }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章