问题和背景:
         需要得到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))