---恢復內容開始---java
最近要寫個WinFrom客戶端應用程序,無奈VC早已經忘記得差很少了。只能靠相似java的C#來寫,後來寫到後臺與窗體交互的時候有了問題,原本想到用回調函數和託管的。ide
後來想到Android裏面有Handler機制,WinFrom應該也有。上網查了點資料,也解決了這個問題,這個可用於窗體與窗體發送消息進行通訊,主要是與界面進行交互。函數
首先,窗體要接收別出來的消息,必須重寫DefWndProc方法,以下:spa
protected override void DefWndProc(ref System.Windows.Forms.Message m) { switch(m.Msg) { //MESSAGEXXX是在後面MESSAGE類定義的常量 case Message.MESSAGEXXX: { //TODO 這裏處理消息 break; } case Message.MESSAGEOOO: { //TODO 這裏處理消息 break; } default: base.DefWndProc(ref m); break; } }
而後實現一個消息發送的累Message,這裏須要用的Win32裏面的動態連接庫user32.dll。code
class Message { [DllImport("user32.dll", EntryPoint = "PostMessage")] //PostMessage也能夠換成SendMessage,主要是user32.dll裏面的函數 private static extern int PostMessage( int hwnd, // 窗體句柄 int msg, // 須要發送的消息,爲整形 int wparam, // int lparam // 後連個變量可做爲傳遞參數之用 ); [DllImport("user32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpclassname, string lpwindowname);//搜索發送消息的目標窗體 //定義消息常數 用來標誌處理哪類消息的參數 public const int MESSAGEXXX= 1; public const int MESSAGECCC= 0; /// <summary> /// 向窗體發送消息的函數 /// </summary> /// <param name="msg"></param> public void SendMessage(int msg) { int window_handler = FindWindow(null, "ImporterManagerForm");//這裏後面字符串表明的是要搜索的窗體,得到窗體句柄 if (window_handler == 0)//不存在當前窗體 { } else PostMessage(window_handler, msg, 100, 200); //發送消息 }
}
而後再別的窗體就能夠發送消息過去了orm
Message msg=new Message(); msg.SendMessage(Message.MESSAGEXXX);
---恢復內容結束---blog