C# 基於消息機制,相似Android Hander,後臺和窗體消息交互

---恢復內容開始---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

相關文章
相關標籤/搜索