首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
tellmenow (22)
cutemouse (22)
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
CSDN - 文档中心 - Delphi 阅读:5397   评论: 2    参与评论
标题   QQ聊天记录器演示程序(二)     选择自 hottey 的 Blog
关键字   QQ,钩子,DLL
出处  

基于上篇,此文将讲述如何捕获自己发送出去的消息:

// hottey   于2004-6-2号

QQ从本机发出消息无非就是两种方式.(1)按发送按钮,(2)按Ctrl+Enter组合键.当然自定义键除外.也不在本文考虑范围之内:

基于这两种发送的方式我选用:WH_CALLWNDPROC 和 WH_KEYBOARD两种钩子.Sorry,今天心情太烂(学校里的一些琐事,郁闷).实在无心继续.只能贴上源码了.大家有兴趣自己看看...有什么问题可以和我联系.delphi21@163.com

//监控Ctrl+Enter组合键

function  KeyboardProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
    if (wParam = VK_RETURN) and (GetKeyState(VK_CONTROL) < 0) and (lParam >= 0) then
      begin
        SendMessage(Shared^.MainWnd,WM_USERCMD, UC_WINDESTROY, GetForegroundWindow);
      end;
      Result := CallNextHookEx(Shared^.KeyHook,iCode,wParam,lParam);
end;

//监控"发送"按钮
function CallWndProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
type
  Msg = ^CWPSTRUCT;
var
  p : Msg;
begin
  p := Msg(lParam);
//只对前台窗口进行处理
  if (p^.message = WM_COMMAND) and (LOWORD(p^.wParam) = 1) then
    begin
      SendMessage(Shared^.MainWnd,WM_USERCMD, UC_WINDESTROY, GetForegroundWindow);
    end;
  Result := CallNextHookEx(Shared^.CallHook,iCode,wParam,lParam);
end;

演示程序相关代码:

procedure TForm1.WndProc(var Msg: TMessage);
begin
 with Msg do
 begin
   if Msg = WM_USERCMD then
   begin
     case wParam of
       UC_WINDESTROY:
       begin
         GetText(Findhwd(HWND(lParam)));
       end;
     end;
   end;
 end;
 inherited;
end;

function TForm1.Findhwd(parent: HWND):HWND;
var
  hwd,hBtn,hMemo:HWND;
begin
    hwd:=findwindowex(parent,0,'#32770',nil);

    Result := 0;
    if (parent<>0) then
    begin
      hBtn := FindwindowEX(hwd,0,nil,'发送(&S)');
      if (hBtn<>0) then
        begin
          hMemo := GetDlgItem(hwd,$00000000);
          if (hMemo<>0) then
            begin
              result := GetWindow(hMemo,GW_CHILD);
            end;
        end;
    end;
end;

procedure TForm1.GetText(hwd: HWND);
var
  Ret: LongInt;
  QQText: PChar;
  Buf: integer;
begin
  GetMem(QQText,1024);
  if (hwd<>0) then
  begin
  try
    Ret := SendMessage(hwd, WM_GETTEXTLENGTH, 0, 0) + 1;
    Buf := LongInt(QQText);
    SendMessage(hwd, WM_GETTEXT, Min(Ret, 1024), Buf);
    memo1.Lines.Add(QQText);
  finally
    FreeMem(QQText, 1024);
  end;
  end;
end;

完整的程序运行以后的图为:

若有什么问题:

请在http://asp.itdrp.com/hottey 上提出. (且上面有源码下载)


相关文章
对该文的评论
hottey ( 2004-06-10)
要想打开本地QQ的聊天记录数据库.技术上我认为比较困难.无能为力了.:)
manhual ( 2004-06-10)
收益不浅呀,非常感谢!

另外:请问有没有办法打开QQ的聊天记录数据包呢?谢啦!