c#實現Windows剪貼簿監視器的代碼具體介紹

來源:互聯網
上載者:User

Windows剪貼簿

剪貼簿(ClipBoard)是記憶體中的一塊地區,是Windows內建的一個非常有用的工具,通過小小的剪貼簿,架起了一座彩橋,使得在各種應用程式之間,傳遞和共用資訊成為可能。然而美中不足的是,剪貼簿只能保留一份資料,每當新的資料傳入,舊的便會被覆蓋。

相關Windows API

最主要的是SetClipboardViewer,每當剪貼簿的內容發生變化時,該函數通過WM_DRAWCLIPBOARD訊息將視窗加入被通知的視窗鏈。
由於剪貼簿觀察器鏈中下一個視窗的控制代碼還沒有返回,應用程式不應傳遞它在SetClipboardViewer
調用過程中接收到的WM_DRAWCLIPBOARD訊息。
如果要從剪貼簿觀察器鏈中去掉視窗鏈,則應用程式必須調用ChangeClipboard成員函數。


        #region Definitions        //Constants for API Calls...        private const int WM_DRAWCLIPBOARD = 0x308;        private const int WM_CHANGECBCHAIN = 0x30D;        //Handle for next clipboard viewer...        private IntPtr mNextClipBoardViewerHWnd;        //API declarations...        [DllImport("user32.dll", CharSet = CharSet.Auto)]        static public extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);        [DllImport("user32.dll", CharSet = CharSet.Auto)]        static public extern bool ChangeClipboardChain(IntPtr HWnd, IntPtr HWndNext);        [DllImport("user32.dll", CharSet = CharSet.Auto)]        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);        #endregion

wndproc函數

作業系統嚮應用程式發送一系列訊息,如左鍵按下和左鍵抬起,應用程式將通過GetMessage等方法最終將訊息提交到視窗過程(WndProc[英文全稱windows process])指向一個應用程式定義的視窗過程的指標。

我們需要重寫該函數來處理剪貼簿內容改變事件:

        #region Message Process        //Override WndProc to get messages...        protected override void WndProc(ref Message m)        {            switch (m.Msg)            {                case WM_DRAWCLIPBOARD:                    {                        //The clipboard has changed...                        //##########################################################################                        // Process Clipboard Here :)........................                        //##########################################################################                        SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());                        //顯示剪貼簿中的文本資訊                        if (Clipboard.ContainsText())                        {                            label1.Text = Clipboard.GetText();                        }                        //顯示剪貼簿中的圖片資訊                        if (Clipboard.ContainsImage())                        {                            pictureBox1.Image = Clipboard.GetImage();                            pictureBox1.Update();                        }                        break;                    }                case WM_CHANGECBCHAIN:                    {                        //Another clipboard viewer has removed itself...                        if (m.WParam == (IntPtr)mNextClipBoardViewerHWnd)                        {                            mNextClipBoardViewerHWnd = m.LParam;                        }                        else                        {                            SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());                        }                        break;                    }            }            base.WndProc(ref m);        }        #endregion

效果:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.