自己想做一个程序,每次开机自动加载,然后通过该程序启动QQ,然后获取QQ窗口句柄,发送消息!应该可以实现吧! 
不过一点就是sendmessage 这个函数还不大会用,哪位大哥能详解一下这个函数呀?
还有获取窗体的句柄,和窗体上控件的句柄有些困难,给点提示!

解决方案 »

  1.   

    http://blog.yesky.com/Blog/tiger12/archive/2005/01/13/64273.aspxQQ消息轰炸机源代码(VB.NET)    http://ggjy.blogchina.com/413592.html
      

  2.   


         sg := '$PARA' + sg;
         formhwnd := FindWindow('TfrmCdMain','');
         SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
      

  3.   

    function TForm1.mygettext(hwnd:THandle):string;
    var
      buf:pchar;
      len:Longint;
    begin
     Len:=Longint(SendMessage(hWnd,WM_GETTEXTLENGTH ,0,0));
     if len>0 then
      begin//1
       try
        getmem(buf,len);
        SendMessage(hWnd,WM_GETTEXT,Len+1,Int64(buf));
        Result:=strpas(buf);
       finally
        freemem(buf);
       end;
      end;//1
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i, hwnd: Integer;
      msg: string; begin
           {Static}
      hwnd := FindWindow(nil, '计算器');
      if hwnd <> 0 then
      begin
        hwnd := findwindowEx(hwnd, 0,'Static', nil);
        edit1.Text :=mygettext(hwnd) 
      end;
    end; 
      

  4.   

    sg := '$PARA' + sg;  //请问这句是什么意思?
         formhwnd := FindWindow('TfrmCdMain','');//QQ窗主界面窗口的类名是TfrmCdMain? 
    //后面的参数应该是 nil 吧,如果是空串不知道能不能找到?
         SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
      

  5.   

    var
      fromhwnd : integer;
    begin
      formhwnd := FindWindow('TfrmCdMain','');
      SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
    end;
      

  6.   

    SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));sg  是什么东西啊,能解释一下吗?你好像没声明这个东西吧~
      

  7.   

    昏倒中,
    你用SPY++自己侦测一下吗?然后配合FindWindow就可以找到窗口,然后使用FindWindowEx找到“发送”的句柄,发WM_LBUTTONDOWN 消息就OKformhwnd := FindWindoEx(‘’, '');
    是找到类TfrmCdMain的窗口的句柄,不是QQ的
    SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
    是写字符进去,看来哥们还没有高清楚WM_SETTEXT应该是这样
    hwnd := FindWindow(‘此处是你用SPY++找到的QQ登陆窗口类’,nil);
      if hwnd <> 0 then
      begin
       formhwnd := FindWindoEx(hwnd,0,nil, '登陆QQ');
       SendMessage(formhwnd,WM_LBUTTONDOWN, 0, 0) 
      END
      

  8.   

    sendmessage 
    第一个参数是你操作的对象句柄,
    第二个是你命令他干什么
      

  9.   

    这是原代码 ,改一点就行了, (写进注册表,启动是运行就ok 了)
       TQQLogin = class(TObject)
      private
        FTimer: TTimer;
        FUserId: String;                
        FPassword: String;
        FApplicationPath: String;
      public
        constructor Create(AUserName , APassword, APath: String);
        destructor Destroy; override;
        procedure QQLogin;
        procedure FTimerTimer(Sender: TObject);
      end;
    Var
      QQHandle,                //QQ主窗口句柄
      HPasswordEdit,           //QQ密码框句柄
      HNumberEdit,             //QQ用户名编辑框
      HLoginButton,            //登陆按钮句柄
      HSpecialHandle: THandle; //特殊按钮句柄  FQQVersion: PChar;  //QQ版本implementation
    function FindQQWindow: THandle;  function GetSpecialButtonHandle(hwnd: HWND; lParam: LPARAM):Boolean; stdcall;
      var
        cName: array[0..128] of Char;
        wName: array[0..128] of Char;
      begin
        result := true;
        GetClassName(hwnd, cName, 128);
        if StrPas(cName) = 'Button' then
        begin
          GetWindowText(hwnd, wName, 128);
          if StrPas(wName) = '软键盘'then
          begin
            FQQVersion := 'V2004Beta';
            PInteger(lParam)^ := hwnd;
            result := false;
          end;
          if StrPas(wName) = '注册向导' then
          begin
            FQQVersion := 'V2003';
            PInteger(lParam)^ := hwnd;
            result := false;
          end;
        end;
      end;  function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
      var
        eName: array[0..180] of Char;
      begin
        Result := true;
        if hwnd = 0 then Exit;
        GetClassName(hwnd, eName, 32);    If CompareText('#32770', StrPas(eName))<>0 Then Exit;    EnumChildWindows(hwnd, @GetSpecialButtonHandle, Integer(@HSpecialHandle));
        if HSpecialHandle <> 0 then
        Begin
          QQHandle:= hwnd;
          Result := False;
        End;
      end;
    begin
      QQHandle:= 0;
      EnumWindows(@EnumWindowsProc, 0);
      Result:= QQHandle;
    end;procedure GetQQHandle;
    Var
      eHandle: THandle;
    begin
      eHandle:= FindQQWindow;
      if eHandle<>0 then
      begin
        HPasswordEdit:= FindWindowEx(eHandle, 0, 'Edit', nil);
        HNumberEdit:= FindWindowEx(eHandle, 0, 'Combobox', nil);
        HLoginButton:= FindWindowEx(eHandle, 0, 'Button', '登录');
      end;
    end;{ TQQLogin }constructor TQQLogin.Create(AUserName , APassword, APath: String);
    begin
      FUserId := AUserName;
      FPassword := APassword;
      FApplicationPath := APath;
      Winexec(PChar(APath), SW_SHOW);
      FTimer:= TTimer.Create(nil);
      FTimer.Interval := 1000;
      FTimer.OnTimer := FTimerTimer;
      FTimer.Enabled := false;
    end;
    destructor TQQLogin.Destroy;
    begin
      FTimer.Free;
      inherited;
    end;{-------------------------------------------------------------------------------procedure TQQLogin.FTimerTimer(Sender: TObject);
    var
      i: integer;
    begin
      GetQQHandle;  If (HNumberEdit=0) or (HPasswordEdit=0) or (HLoginButton=0) Then Exit;  SendMessage(HNumberEdit, WM_SETTEXT, 0, Integer(FUserId));  if FQQVersion = 'V2004Beta' then
      begin
        For I:= 1 To Length(FPassword) Do
          SendMessage(HPasswordEdit, WM_USER+513, Integer(FPassword[I]), 0);
      end
      else
      begin
        For I:= 1 To Length(FPassword) Do
        begin
          SendMessage(HPasswordEdit, WM_CHAR, Integer(FPassword[I]), 0);
        end;
      end;  SendMessage(HLoginButton, WM_LBUTTONDOWN, 0, 0);
      SendMessage(HLoginButton, WM_LBUTTONUP, 0, 0);  FTimer.Enabled := False;
      Free;
    end;说明:      开始登陆
    procedure TQQLogin.QQLogin;
    begin
      FTimer.Enabled := True;
    end;end.