問題和背景:
         需要得到QQ2009中聊天記錄無法獲取的問題,由於QQ整個軟體都是直畫的,用QTP的SPY根本就無法獲得QQ聊天對話方塊內容,因此也無法判斷髮送的聊天記錄是否在聊天曆史記錄中有顯示。為此非常困頓,某日和曾爺訴苦的過程中,突然想到剪下版,如果內取得剪下版內容那麼我在開啟聊天窗體的時候,在歷史聊天記錄中來個Ctrl+c 問題不就解決了嗎。聽上去感覺是很土的八路做法,不過關鍵是抗戰能夠勝利即可。照著這個思路順利的解決了這個問題,特將程式碼和過程貼如下
         C#,提供DLL解決取得剪下版內容的問題:
         首先需要新建類庫工程, ClipboardHelp。需要引用System.Forms等庫若干,需要新建窗體類,因為主要使用窗體訊息機制來實現的。
         原始碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace ClipboardHelp
{
    public partial class ClipboardForm : Form
    {
        [System.Runtime.InteropServices.DllImport(“user32”)]
        private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
        [System.Runtime.InteropServices.DllImport(“user32”)]
        private static extern IntPtr ChangeClipboardChain(IntPtr hwnd, IntPtr hWndNext);
        [System.Runtime.InteropServices.DllImport(“user32”)]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
 
        const int WM_DRAWCLIPBOARD = 0x308;
        const int WM_CHANGECBCHAIN = 0x30D;
 
        IntPtr NextClipHwnd;
        private String _cText ;
        public string cText
        {
            get { return this._cText; }
            set { this._cText = value; }
        }
 
 
        public ClipboardForm()
        {
            InitializeComponent();
        }
 
        private void ClipboardForm_Load(object sender, EventArgs e)
        {
            NextClipHwnd = SetClipboardViewer(this.Handle); 
        }
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_DRAWCLIPBOARD:
                    //將WM_DRAWCLIPBOARD訊息傳遞到下一個觀察鏈中的視窗
                    SendMessage(NextClipHwnd, m.Msg, m.WParam, m.LParam);
                    IDataObject iData = Clipboard.GetDataObject();
                    //檢測文字
                    if (iData.GetDataPresent(DataFormats.Text) | iData.GetDataPresent(DataFormats.OemText))