• [转]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.
  • 相关阅读:
    THUSC2018退役预定
    TAT
    dsu on tree(CF600E Lomsat gelral)
    Bzoj4784: [Zjoi2017]仙人掌
    [APIO2018] Duathlon 铁人两项
    仙人掌基础
    Bzoj3672: [Noi2014]购票
    CF809E Surprise me!
    虚树(Bzoj3611: [Heoi2014]大工程)
    Bzoj3197: [Sdoi2013]assassin
  • 原文地址:https://www.cnblogs.com/sunsoft/p/1964978.html
Copyright © 2020-2023  润新知