MSN 最大的缺点我觉得是不能保存聊天记录,MSNHelper 新版本也开始不能用了。虽然,我可
以使用窗口枚举获得 MSN 的聊天窗口,并进一步获得 MSN 的 RichEdit20W 子窗口,通过读取
这个子窗口的文字,随时将它保存到文件,但有 2 个缺点,首先是文件的内容太多重复,第 2
是老是要记着执行保存。有没有好的办法解决它呢?重复文字,我们可以开两个缓存,根据对比
结果确定保存哪些文字,自动保存,放一个 Time 控件就应该可以的。又有没有更好的办法了?
以下是获取 MSN 聊天窗口并获取内部文字的代码:
====================================================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function ChildWnd(Wnd: HWND;
Param: lParam): Boolean;stdcall;
var
Buffer:array[0..32]of char;
str:String;
Clipboard:THandle;
ChatPtr
Char;
begin
Result:=true;
if GetClassName(Wnd,@Buffer,32)=0 then
exit;
Str:=StrPas(@Buffer);
if (Str='RichEdit20W') or (Str='RichEdit20A') then
begin
SendMessage(Wnd,EM_SETSEL,0,-1);
SendMessage(Wnd,WM_COPY,0,0);
SendMessage(Wnd,EM_SETSEL,-1,0);
if IsClipboardFormatAvailable(CF_TEXT) then
begin
OpenClipboard(0);
Clipboard:=GetClipboardData(CF_TEXT);
ChatPtr:=GlobalLock(Clipboard);
// .... 这里可以添加查找文字中重复的内容,过滤它
Form1.Memo1.Text:=StrPas(ChatPtr);
// .... 这里可以添加保存到文件的代码 (或在 Memo Change 加)
GlobalUnlock(Clipboard);
CloseClipboard;
end;
end;
end;
function MainWindows(Wnd: HWND;
Param: lParam): Boolean;stdcall;
var
Buffer:array[0..63]of Char;
str:String;
begin
Result:=true;
GetWindowText(wnd,@Buffer,63);
if StrLen(@Buffer)<1 then
exit;
Str:=StrPas(@Buffer);
if Pos('- 对话',Str) = 0 then
exit
else
EnumChildWindows(Wnd,@ChildWnd,0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Caption - Get MSN Chat
Memo1.WordWrap:=True;
EnumWindows(@MainWindows,0);
end;
end.