zoukankan      html  css  js  c++  java
  • [转]QQ2008自动聊天精灵delphi源码

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Buttons, ExtCtrls,Registry, ExtDlgs, bsSkinShellCtrls,
       BusinessSkinForm, bsSkinBoxCtrls, bsSkinCtrls;

    type
    TTform1 = class(TForm)
         GroupBox1: TGroupBox;
         Bevel1: TBevel;
         Label2: TLabel;
         Bevel2: TBevel;
         Bevel3: TBevel;
         Bevel4: TBevel;
         FindBtn: TSpeedButton;
         Image1: TImage;
         SendBtn: TSpeedButton;
         LoadBtn: TSpeedButton;
         loaddialog1: TOpenDialog;
         ListBox1: TListBox;
         bsBusinessSkinForm1: TbsBusinessSkinForm;
         bsSkinOpenDialog1: TbsSkinOpenDialog;
         AoutBtn: TSpeedButton;
         procedure FormCreate(Sender: TObject);
         procedure FindBtnClick(Sender: TObject);
         procedure LoadBtnClick(Sender: TObject);
         procedure SendBtnClick(Sender: TObject);
         procedure AoutBtnClick(Sender: TObject);

    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Tform1: TTform1;

    implementation
    {$R *.dfm}
    //定义一组全程变量
    const
        WinCaption07:string='聊天中';
        WinCaption08:string='交谈中';
    var
       x:integer;
       TextBoxNum:shortint; //QQ输入框是第几个对话框
       SendButtonNum:shortint; //发送按钮是第几个按钮
       QQInputBoxHandle,SendButtonHandle:HWND;//发送按钮和输入框句柄
       StopSend:boolean;
    //=====================延时时程序===================
    procedure Delay(msecs:integer);
    var
    FirstTickCount:longint;
    begin
    FirstTickCount:=GetTickCount;
    repeat
         if STopSend then   exit ;
         Application.ProcessMessages;
    until ((GetTickCount-FirstTickCount) >= Longint(msecs));
    end;
    //=====================得到窗口内容===================
    function GetWindowStr(Wnd: HWND): String;
    var
    Len: Integer;
    begin
    Len := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
    SetLength(Result, Len + 1);
    SendMessage(Wnd, WM_GETTEXT, Length(Result), Longint(@Result[1]));
    end;
    //=====================得到所属类===================
    function GetWindowClass(Wnd: HWND): String;
    begin
    SetLength(Result, 65);
    GetClassName(Wnd, @Result[1], 65);
    end;

    //=====================查找子控件===================
    function EnumChildProc(Wnd: HWND; lParam: LPARAM): Boolean; stdcall;
    var
    S, C: String;
    begin
       S := GetWindowStr(Wnd);
       C := GetWindowClass(Wnd);
          X:=X+1;

         if   Pos('RichEdit', C) =1   then
           begin
             TextBoxNum:=TextBoxNum+1;
             if   TextBoxNum =3 then QQInputBoxHandle :=Wnd;
           end;
         if (pos('发送',S) =1) and (Pos('Button', C) =1) then
           begin
             if   SendButtonNum=2 then   SendButtonHandle:=wnd;
             SendButtonNum:= SendButtonNum+1;
           end;
    Result := True;
    end;
    //=====================定义一个回调函数===================

    function EnumWindowsProc(Wnd: HWND; lParam: LPARAM): Boolean; stdcall;
    var
    S, C: String;
    begin
    S := GetWindowStr(Wnd);
    C := GetWindowClass(Wnd);
    //看是07和08版QQ的标题吗?
    if (Pos(WinCaption07, S) >0) or (Pos(WinCaption08, S) >0) then
       begin   //如果找到QQ窗体则找出所有控件
         if not EnumChildWindows(Wnd, @EnumChildProc, lParam) then ;
         Result := False;
       end;
    Result := True;
    end;
    //=====================主表单初始化===================
    procedure TTform1.FormCreate(Sender: TObject);
    begin
       //初始化表单和列表框颜色
       Tform1.color:=tcolor(rgb(236,233,216));
       ListBox1.color:=Tcolor(rgb(96,96,97));
    end;

    //=====================查找QQ主窗体===================
    procedure TTform1.FindBtnClick(Sender: TObject);
    begin
       X:=0;
       TextBoxNum:=1;
       SendButtonNum:=1;

       try
       if not EnumWindows(@EnumWindowsProc, Integer(Pointer(ListBox1))) then ;
       finally
         if X = 0 then messagebox( Tform1.Handle,'不能找到QQ发送窗口!','错误',MB_OK+MB_DEFBUTTON1 +MB_ICONHAND);   end;
       listbox1.ItemIndex:=0;
       if (QQInputBoxHandle<>0) and (SendButtonHandle <>0) then SendBtn.Enabled :=True;
    end;

    //=====================装入聊天记录===================
    procedure TTform1.LoadBtnClick(Sender: TObject);
    begin
    if bsSkinOpenDialog1.execute then
        begin
          ListBox1.Clear;
          ListBox1.Items.LoadFromFile(bsSkinOpenDialog1.filename);
        end;
    end;

    //=====================可中断的连续发送================
    procedure TTform1.SendBtnClick(Sender: TObject);
    var
       SendTxt:string;
    begin

       StopSend := False; //把是否安暂停设为不停
       if SendBtn.Caption='发 送' then
         begin
           SendBtn.Caption :='暂 停';
         end
       else
         begin //如果是暂停按钮按下
           SendBtn.Caption:='发 送';
           StopSend:=True;
         end;

       while (listbox1.ItemIndex<ListBox1.Items.Count-1) and (not StopSend)   do
         begin
            listbox1.ItemIndex:=listbox1.ItemIndex+1;

            //如果导入的文本文件里有空行,则跳过空行
            while ListBox1.Items.strings[listbox1.ItemIndex]='' do listbox1.ItemIndex:=listbox1.ItemIndex+1;

            if STopSend then    exit; //如果暂停键按下
            SendTxt :=ListBox1.Items.strings[listbox1.ItemIndex];
            SendMessage(QQInputBoxHandle,EM_REPLACESEL,180,Integer(Pchar(SendTxt)));
            delay(300);
            SendMessage(SendButtonHandle,BM_CLICK,0,0);
         end;
    end;

    procedure TTform1.AoutBtnClick(Sender: TObject);
    begin
       messagebox( Tform1.Handle,'QQ2008!','关于',MB_OK+MB_DEFBUTTON1 +MB_ICONQUESTION );
    end;

    end.
  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/sunsoft/p/1964978.html
Copyright © 2011-2022 走看看