欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在.NET中基于Windows消息的IPC實(shí)現
在.NET中基于Windows消息的IPC實(shí)現
那么在windows當前系統下,如何實(shí)現進(jìn)程通訊呢?其實(shí)有很多方法,如:
1、    剪貼板Clipboard
2、    DDE(動(dòng)態(tài)數據交換)
3、    內存映像
4、    消息管道
5、    郵件槽
6、    Socket
7、    RPC
8、    串行/并行通信(Serial/Parallel Communication)
9、    COM/DCOM
10、Windows消息
三、基于Windows消息的IPC
現在讓我們進(jìn)入今天我們要講的主題:“基于Windows消息的IPC實(shí)現”。
在這里,我假定大家對Windows消息機制都有很好的理解,所以我就不在這上面費太多的墨水了。我們直接看看Windows消息是怎么樣實(shí)現進(jìn)程間通訊的。我們首先看看Windows的消息常數:
WM_COPYDATA=0x004A//  當一個(gè)應用程序傳遞數據給另一個(gè)應用程序時(shí)發(fā)送此消息。
這就是我們要的。下面我們來(lái)看看如何利用它來(lái)實(shí)現IPC。
讓我們先看看幾個(gè)API函數,沒(méi)有它們,我們沒(méi)有辦法將數據發(fā)送出去。
1、 PostMessage
函數功能:該函數將一個(gè)消息放入(寄送)到與指定窗口創(chuàng )建的線(xiàn)程相聯(lián)系消息隊列里,不等待線(xiàn)程處理消息就返回。消息隊列里的消息通過(guò)調用GetMessage和PeekMessage取得。
函數原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
參數
hWnd:其窗口程序接收消息的窗口的句柄??扇∮刑囟êx的兩個(gè)值:
HWND.BROADCAST:消息被寄送到系統的所有頂層窗口,包括無(wú)效或不可見(jiàn)的非自身?yè)碛械拇翱?、被覆蓋的窗口和彈出式窗口。消息不被寄送到子窗口。
NULL:此函數的操作和調用參數dwThread設置為當前線(xiàn)程的標識符PostThreadMessage函數一樣。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函數調用成功,返回非零值:如果函數調用失敗,返回值是零。若想獲得更多的錯誤信息,請調用GetLastError函數。
2、 SendMessage
函數功能:該函數將指定的消息發(fā)送到一個(gè)或多個(gè)窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個(gè)消息寄送到一個(gè)線(xiàn)程的消息隊列后立即返回。
函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
參數:
hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發(fā)送到系統中所有頂層窗口,包括無(wú)效或不可見(jiàn)的非自身?yè)碛械拇翱?、被覆蓋的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。
Msg:指定被發(fā)送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息處理的結果,依賴(lài)于所發(fā)送的消息。
3、 RegisterWindowMessage
函數功能:RegisterWindowMessage函數定義一個(gè)新的窗口消息,該消息保證在整個(gè)系統范圍內是唯一的。調用SendMessage或PostMessage函數時(shí)可以使用該函數返回的消息值。
函數原型:UINT RegisterWindowMessage(lpsz)
參數:
lpsz指向一個(gè)以NULL結束的字符串,該字符串指定待登記的消息。
返回值:若成功地登記了消息,返回值是一個(gè)消息標識符。該標識符值的范圍在0XC000到0XFFFF之間,否則,返回值為0。
我們現在在C#中聲明這些API函數:
        [DllImport("user32")]
        internal static extern int RegisterWindowMessage(string lpString);
        [DllImport("user32")]
        internal static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
        [DllImport("user32")]
        internal static extern int PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32")]
        internal static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
然后定義一些我們需要的常數:
                internal const int WM_COPYDATA = 0x004A; //當一個(gè)應用程序傳遞數據給另一個(gè)應用程序時(shí)發(fā)送此消息
        internal const int WM_DESTROY = 0x0002; //窗體被銷(xiāo)毀
        internal const int WM_CREATE = 0x0001; //應用程序創(chuàng )建一個(gè)窗口
        internal const int WM_QUERYENDSESSION = 0x0011; //當用戶(hù)選擇結束對話(huà)框或程序自己調用ExitWindows函數
        internal static readonly IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);
我們還需要一個(gè)傳送數據的結構:
    /**////<summary>
    ///發(fā)送WM_COPYDATA消息的數據結構
  ///</summary>
    internal struct COPYDATASTRUCT
    {
        /**////<summary>
        ///用戶(hù)自定義數據
        ///</summary>
        internal IntPtr dwData;
        /**////<summary>
        ///數據長(cháng)度
        ///</summary>
        internal int cbData;
        /**////<summary>
        ///數據首地址指針
        ///</summary>
        internal IntPtr lpData;
    }
現在我們來(lái)看看具體如何實(shí)現:
1、 我們首先創(chuàng )建一個(gè)類(lèi),讓它從Form類(lèi)繼承,因為我們需要一個(gè)窗體,然后對它的消息進(jìn)行處理:
 
internal class WinMsg : Form
{
        private string _messageString;
        private List<IntPtr> _windowList;
        private int _message;
        private int _intHandler;
        private bool _isConnected;
}
 
2、 然后定義構造函數,在構造函數里注冊一個(gè)消息通道值,并發(fā)出一個(gè)廣播通知其它在這個(gè)通道的窗口。
        internal WinMsg(string messageString)
        {
            _messageString = messageString;
            _isConnected = false;
            _intHandler = Handle.ToInt32();
            _windowList = new List<IntPtr>();
            _message = Win32.RegisterWindowMessage(_messageString);//注冊一個(gè)消息通道
            int errCode = Win32.PostMessage(Win32.HWND_BROADCAST, _message, Win32.CONNECTION, _intHandler);//向此通道內所有的窗口廣播自己的句柄
            if (errCode == 0)
            {
                throw new Win32Exception(errCode);//發(fā)生錯誤,拋出異常
            }
            else
            {
                _isConnected = true;
            }
        }
3、 重寫(xiě)基類(lèi)的WndProc函數,處理接收到的消息:
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == _message)//接收到廣播消息,進(jìn)行處理
            {
                int LParam = m.LParam.ToInt32();
                int WParam = m.WParam.ToInt32();
                if (LParam != 0 && LParam != _intHandler)
                {
                    if (WParam == Win32.DISCONNECTION)
                    {
                        _windowList.Remove(m.WParam);//將對方窗口的句柄從列表中刪除
                    }
                    else
                    {
                        if (WParam==Win32.CONNECTION)
                        {
                            Win32.PostMessage(m.LParam, _message, Win32.REVERSION, _intHandler);
                        }
                        _windowList.Add(m.LParam);//將對方窗口的句柄存入列表中
                    }
                }
                return;
            }
            switch (m.Msg)
            {
                case Win32.WM_COPYDATA://接收到其它窗口發(fā)送過(guò)來(lái)的數據
                    {
                        COPYDATASTRUCT data = new COPYDATASTRUCT();
                        data = (COPYDATASTRUCT)m.GetLParam(data.GetType());
                        byte[] message = new byte[data.cbData];
                        Marshal.Copy(data.lpData, message, 0, data.cbData);//從非托管內存中將數據復制到我們的byte數組中。
                        Anyzler(m.WParam, message);//在這里處理接收到的數據。
                    }
                    break;
                case Win32.WM_DESTROY:
                case Win32.WM_QUERYENDSESSION://窗口被關(guān)閉,向其它窗口廣播通知從隊列中刪除自己
                    Win32.PostMessage(Win32.HWND_BROADCAST, _message, Win32.DISCONNECTION, _intHandler);
                    base.WndProc(ref m);//調用基類(lèi)的消息處理函數。
                    break;
                default:
                    base.WndProc(ref m); //調用基類(lèi)的消息處理函數。
                    break;
            }
        }
4、 定義發(fā)送消息的函數:
        internal void Send(byte[] message)
        {
            if (_isConnected)
            {
                int length = message.Length;
                IntPtr ptr = Marshal.AllocHGlobal(length);//申請一塊非托管內存
                Marshal.Copy(message, 0, ptr, length);//將要發(fā)送的數據封送到非托管內存
                COPYDATASTRUCT data = new COPYDATASTRUCT();
                data.dwData = IntPtr.Zero;//這里可以隨意定義。
                data.cbData = length;//傳遞要發(fā)送的數據的長(cháng)度
                data.lpData = ptr;//傳遞要發(fā)送的數據的地址指針
                //向其它所有窗口發(fā)送數據,這里不能發(fā)廣播消息。必須一個(gè)一個(gè)發(fā)送。
                foreach (IntPtr window in _windowList)
                {
                    Win32.SendMessage(window, Win32.WM_COPYDATA, this.Handle, ref data);
                }
                Marshal.FreeHGlobal(ptr);//釋放這塊非托管內存,這行一定要寫(xiě)上,不然會(huì )內存泄漏。
            }
        }

本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/Comman1999/archive/2009/10/26/4728786.aspx
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用Windows API實(shí)現一個(gè)簡(jiǎn)單的文本輸入框
孫鑫VC視頻教程筆記之第一課“Windows程序的內部運行原理”
windows窗口的創(chuàng )建
Windows程序基本框架
Windows消息編程原理
用Win32 application建立窗體_入門(mén)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久