www.pudn.com > SendQQMsg.rar > main.pas


unit main; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Buttons, ExtCtrls, ShellApi, ComCtrls, jpeg; 
 
type 
  TSendType = (stStart, stStop); 
  TfrmSend = class(TForm) 
    btnStart: TBitBtn; 
    btnStop: TBitBtn; 
    btnClose: TBitBtn; 
    tmrSend: TTimer; 
    Label1: TLabel; 
    Label2: TLabel; 
    edtTime: TEdit; 
    rbOrder: TRadioButton; 
    rbRandom: TRadioButton; 
    cbTop: TCheckBox; 
    reSend: TRichEdit; 
    btnAbout: TBitBtn; 
    imgSend: TImage; 
    Panel1: TPanel; 
    Edit1: TEdit; 
    procedure edtTimeKeyPress(Sender: TObject; var Key: Char); 
    procedure cbTopClick(Sender: TObject); 
    procedure btnStartClick(Sender: TObject); 
    procedure btnStopClick(Sender: TObject); 
    procedure btnAboutClick(Sender: TObject); 
    procedure btnCloseClick(Sender: TObject); 
    procedure tmrSendTimer(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure imgSendClick(Sender: TObject); 
  private 
    { Private declarations } 
    procedure DropFiles(var aMsg: TMessage); message WM_DROPFILES; 
    procedure LoadFile(aFileName: string); 
    procedure CheckEditInput(var Key: Char); 
    procedure SetState(aSendType: TSendType); 
  public 
    { Public declarations } 
  end; 
 
var 
  frmSend: TfrmSend; 
 
implementation 
uses Clipbrd; 
var 
  hw, hb, he: integer; 
  i, iLength: Integer; 
 
{$R *.dfm} 
 
function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall; 
var 
  cName: array[0..180] of Char; 
  wName: array[0..32] of Char; 
begin 
  GetClassName(hwnd, cName, 32); 
  GetWindowText(hwnd, wName, 180); 
  if Pos('聊天中', StrPas(wName)) > 0then 
  begin 
    hw := hwnd; 
    if Pos('一生中最爱', StrPas(wName)) > 0then hw:=-1; 
    result := false; 
  end 
  else 
    result := true; 
end; 
 
function GetButtonHandle(hwnd: HWND; lParam: LPARAM):Boolean; stdcall; 
var 
  cName: array[0..180] of Char; 
  wName: array[0..12] of Char; 
begin 
  result := true; 
  GetClassName(hwnd, cName, 180); 
  if StrPas(cName) = 'Button' then 
  begin 
    GetWindowText(hwnd, wName, 12); 
    if StrPas(wName) = '发送(&S)' then 
    begin 
      PInteger(lParam)^ := hwnd; 
      result := false; 
    end; 
  end; 
end; 
 
function GetEditHandle(hwnd: HWND; lParam: LPARAM):Boolean; stdcall; 
var 
  cName: array[0..180] of Char; 
begin 
  result := true; 
  GetClassName(hwnd, cName, 180); 
  //frmSend.reSend.Lines.Add(cName); 
  if StrPas(cName) = 'RICHEDIT' then 
  begin 
 
    PInteger(lParam)^ := hwnd; 
    if i = 1 then result := false; 
    i := i + 1; 
  end; 
end; 
 
procedure TfrmSend.DropFiles(var aMsg: TMessage); 
var 
  fName: array[0..90] of char; 
begin 
  DragQueryFile(thandle(aMsg.wParam), 0, fName, 250); 
  if FileExists(fName) then 
    LoadFile(fName); 
end; 
 
procedure TfrmSend.LoadFile(aFileName: string); 
var 
  fName: string; 
  f: TextFile; 
begin 
  fName := aFileName; 
  if ExtractFileExt(fName) = '.txt' then 
  begin 
    AssignFile(f, fName); 
    ReSet(f); 
    if not Eof(f) then 
      reSend.Lines.LoadFromFile(fName); 
    CloseFile(f); 
  end; 
end; 
 
procedure TfrmSend.CheckEditInput(var Key: Char); 
begin 
  if (edtTime.Text = '') and (Key = '0') then 
  begin 
    Key := #0; 
    Exit; 
  end; 
  if (edtTime.SelText = edtTime.Text) and(Key = '0') then 
  begin 
    edtTime.Clear; 
    Key := #0; 
    Exit; 
  end 
  else if edtTime.SelLength <> 0 then 
    if (StrToIntDef(StringReplace(edtTime.Text, edtTime.SelText, '', []), 0) = 0) or 
       (edtTime.SelText = edtTime.Text[1]) then 
    begin 
      if Key = '0' then 
        Key := #0; 
      Exit; 
    end; 
  if not (Key in ['0'..'9', #8]) then 
    Key := #0; 
  if (StrToIntDef(edtTime.Text, 0) > 1000) and (edtTime.SelLength = 0) then 
    if Key <> #8 then Key := #0; 
end; 
 
procedure TfrmSend.SetState(aSendType: TSendType); 
begin 
  case aSendType of 
    stStart: 
    begin 
      btnStart.Enabled := true; 
      btnStop.Enabled := false; 
    end; 
    stStop: 
    begin 
      btnStart.Enabled := false; 
      btnStop.Enabled := true; 
    end; 
  end; 
end; 
//延时函数 
procedure Delay(minisec: integer); //毫秒为单位 
var 
  endtime: integer; 
begin 
  endtime := GetTickCount() + minisec; 
  repeat 
    Application.ProcessMessages(); 
  until endtime < GetTickCount(); 
end; 
procedure TfrmSend.tmrSendTimer(Sender: TObject); 
var 
  sMsg: string; 
begin 
  tmrSend.Enabled:=false; 
  if rbOrder.Checked then 
  begin 
    sMsg := reSend.Lines[i]; 
    if i = iLength - 1 then i := 0 
    else 
      i := i + 1; 
  end 
  else 
  begin 
    Randomize; 
    sMsg := reSend.Lines[Random(iLength)]; 
  end; 
  application.ProcessMessages; 
  edit1.Text:=trim(smsg); 
  if edit1.Text<>'' then 
    begin 
      edit1.SetFocus; 
      edit1.SelectAll; 
 
      keybd_event(VK_CONTROL,0,0,0); 
      keybd_event(byte('C'),byte(Mapvirtualkey(byte('C'),0)),0,0); 
      keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); 
      keybd_event(byte('C'),byte(Mapvirtualkey(byte('C'),0)),KEYEVENTF_KEYUP,0); 
      edit1.CopyToClipboard; 
      SetForegroundWindow(hw); 
 
      SendMessage(he, WM_SETfocus, 0, 0); 
      delay(1000); 
      keybd_event(VK_CONTROL,0,0,0); 
      keybd_event(byte('V'),byte(Mapvirtualkey(byte('V'),0)),0,0); 
      keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); 
      keybd_event(byte('V'),byte(Mapvirtualkey(byte('V'),0)),KEYEVENTF_KEYUP,0); 
      try 
        Clipboard.Clear; 
      except 
      end; 
      SendMessage(hb, WM_LBUTTONDOWN, 0, 0); 
      SendMessage(hb, WM_LBUTTONUP, 0, 0); 
    end; 
  if btnstop.Enabled=false  then exit; 
  tmrSend.Enabled:=true; 
end; 
 
procedure TfrmSend.edtTimeKeyPress(Sender: TObject; var Key: Char); 
begin 
  SetState(stStart); 
  tmrSend.Enabled := false; 
  CheckEditInput(Key); 
end; 
 
procedure TfrmSend.cbTopClick(Sender: TObject); 
begin 
  if cbTop.Checked then 
    self.FormStyle := fsStayOnTop 
  else 
    self.FormStyle := fsNormal; 
end; 
 
procedure TfrmSend.imgSendClick(Sender: TObject); 
begin 
  ShellExecute(self.Handle, nil, 'mailto:dxmylove@yahoo.com.cn?subject=关于QQ消息发送器', nil, nil, SW_SHOWNORMAL); 
end; 
procedure GetQqWindowHandle; 
var hparent,hbutton,hbutton1:integer; 
begin 
  hparent:=0; 
  repeat 
    hparent:=findwindowex(0,hparent,'#32770',nil);       //QQ对话框的类为#32770,这样循环调用FindWindowEx ( )就能每次时钟生效时更新hparent的值。从已查找的句柄为hparent的窗体后查找符合要求的窗体。 
    hbutton:=findwindowEX(hparent,0,nil,'发送(&S)');    //每次判断找到的窗口的句柄,看这个窗体中是否存在‘发送(&S)’按钮。存在即找到了正确的QQ对话框。 
    if hbutton+hparent=0 then break;//没有找到窗口 
  until  hbutton<>0;                                //找到QQ对话框后跳出循环。 
  hbutton1:=findwindowex(hparent,0,nil,'聊天模式(&T)') ;  // 找到QQ对话窗体后,查找聊天模式按钮句柄。 
  if hbutton1<>0 then                       //若此时存在聊天模式按钮即现在QQ窗体处于消息模式状态。 
     sendmessage(hbutton1,BM_CLICK,0,0);     //给聊天模式按钮发送单击消息。将窗体转换为聊天模式。 
  hw:=hparent; 
end; 
procedure TfrmSend.btnStartClick(Sender: TObject); 
begin 
  i := 0; 
  iLength := reSend.Lines.Count; 
  if iLength=0 then exit; 
  EnumWindows(@EnumWindowsProc, 0); 
  //GetQqWindowHandle; 
  if hw = 0 then 
    begin 
      MessageBox(self.Handle, '你的QQ没有开,或者不在[聊天模式]!', '提示', mb_IconInformation + mb_Ok); 
      exit; 
    end; 
  if hw = -1 then 
    begin 
      MessageBox(self.Handle, '哇,别给我发啊,呵呵!', '提示', mb_IconInformation + mb_Ok); 
      exit; 
    end; 
  EnumChildWindows(hw, @GetButtonHandle, Integer(@hb)); 
  EnumChildWindows(hw, @GetEditHandle, Integer(@he)); 
  tmrSend.Interval := StrToIntDef(edtTime.Text, 500); 
  i := 0; 
  SetState(stStop); 
  tmrSend.Enabled := true; 
end; 
 
procedure TfrmSend.btnStopClick(Sender: TObject); 
begin 
  btnStop.Enabled:=false; 
  btnStart.Enabled:=true; 
  tmrSend.Enabled := false; 
end; 
 
procedure TfrmSend.btnAboutClick(Sender: TObject); 
var 
  sAbout: string; 
begin 
  sAbout := 'QQ消息发送器,定时向目标QQ发送设定的消息' + #13 + 
            '支持消息设定,关闭时其设定消息自动保存' + #13 + 
            '支持消息拖入,可将文本文件等拖入发送器中' + #13 + 
            '其会依设定顺序或随机逐句向对方QQ发送框中消息' + #13 + 
            '发送时,请设聊天模式为[对话模式]' + #13 + 
            //'若用初始设定之消息,则删除其产成之msg.txt文件' + #13 + 
            '---------------------------------------------------' + #13 + 
            '---------------------------------------------------' + #13 + 
            '作者:一生中最爱'+#13+ 
            'Email:dxmylove@yahoo.com.cn'+#13+ 
            'QQ:171833017'+#13+ 
            'URL:http://www.websamba.com/dxmylove'+#13+ 
            ''; 
  MessageBox(self.Handle, PChar(sAbout), '关于', mb_IconInformation + mb_Ok); 
end; 
 
procedure TfrmSend.btnCloseClick(Sender: TObject); 
begin 
  tmrSend.Enabled := false; 
  Close; 
end; 
 
procedure TfrmSend.FormShow(Sender: TObject); 
var 
  fName: string; 
begin 
  DragAcceptFiles(self.Handle, true); 
  Application.ShowHint := true; 
  Application.HintColor := clLime; 
  fName := ExtractFilePath(Application.ExeName) + 'msg.txt'; 
  {if FileExists(fName) then 
    LoadFile(fName);} 
  if (ParamCount > 0) and FileExists(ParamStr(1)) then 
    LoadFile(ParamStr(1)); 
  edit1.Left:=-1000; 
end; 
 
procedure TfrmSend.FormClose(Sender: TObject; var Action: TCloseAction); 
var 
  fName: string; 
begin 
  if btnstop.Enabled then btnstop.Click; 
  fName := ExtractFilePath(Application.ExeName) + 'msg.txt'; 
  //reSend.Lines.SaveToFile(fName); 
end; 
 
end.