2008年9月23日 星期二

兩程式之間的訊息傳遞(使用SendMessage)

想要從一個程式傳送消息到另一個程式可以使用下面兩個Win32 API
1. SendMessage( ):用來傳遞消息代號
2. FindWindows( ):用來找出目標視窗的Handler

下面例子為由Client端發送訊息至Server端

Client端程式

using System.Runtime.InteropServices;

public class Client
{
 [DllImport("User32.dll", EntryPoint = "FindWindow")]
 private static extern int FindWindows(string lpClassName, string lpWindowName);

 [DllImport("User32.dll", EntryPoint = "SendMessage")]

 private static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
 
 
public Cliect()
 {
  //傳送代號為1982,且帶兩個參數為8與1的訊息到另一支程式
  SendMsgToServer(1982, 8, 1);    
 }

 //傳送訊息至Server端  
 public void SendMsgToServer(int msgCode, int wp, int lp)
 {
  //先取得另一支程式的視窗Handler,
  //這裡使用視窗標題名稱 "Form1" 來尋找
  int windowHandler = FindWindows(null, @"Form1");
  if (windowHandler > 0) 
  {
   //傳送訊息     
   int hr = SendMessage(windowHandler, msgCode, wp, lp);
  }
 }
}

Server端程式 (主要為覆寫 DefWndProc 事件處理函式)

publc class Server
{
 protected override void DefWndProc(ref Message m)
 {
  if (m.Msg == 1982)
  {
   MessageBox.Show(string.Format( "My birthday is {0}-{1}-{2}", m.Msg, m.WParam, m.LParam));
  }
  else
   base.DefWndProc(ref m);
 }
}

PS1. 如果電腦中同時有數個相同標題名稱的視窗,只有最上層的視窗收的到訊號,也就是說FindWindows( )只會回傳最上層視窗的Handler。

PS2.無法發送訊號時,請檢查msgCode是否太小。

沒有留言:

張貼留言