问题和背景:
需要得到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))
本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/283263,如需转载请自行联系原作者