您的位置:首页 > 编程语言 > Qt开发

QTP和Clipboard(剪切板)完美组合解决QQ聊天记录获得的问题 推荐

2010-01-04 15:02 435 查看
问题和背景:
需要得到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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息