用Delphi编程如何判断电脑中运行的QQ号是多少?

解决方案 »

  1.   

    楼主要盗Q号?
    \QQ2009\Users下面有几个目录,用过的Q号都在里面。
    想获取当前正在用的Q号可以用GetActiveWindow在发现有QQ登陆对话框时HOOK键盘,
    密码是HOOK不到的,腾讯防了这一手,HOOK到的不是用户输入的密码。
      

  2.   

    如果退出QQ时没有设置删除全部,一般在qq安装目录下有个文件夹是以登录过的qq号命名的文件夹,可以研究一下。
      

  3.   

    LZ你获取到当前QQ好以后呢 ?、下一步你想干啥???
      

  4.   

    我做了个软件,想用QQ号来验证用户身份。
    就是检测到QQ号已登录了就可以使用软件。
      

  5.   

    获取窗体标题。
    标题上就有显示QQ号码
    具体获取标题方法:
    procedure TMainFr.Timer1Timer(Sender: TObject);
    Var
      hw:HWND;
      pid:dword;
      hid:THandle; //当前的  p: array[0..254] of char;
      t:String;
    begin
      hw := GetForegroundWindow;  if hw<>0 then GetWindowThreadProcessId(hw, @pid) else Exit;
      //hid := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
      GetWindowText(hw, p, Length(p));
      t := p; //t就是标题了,里面就有QQ号码
    end;
      

  6.   

    如果窗体标题有QQ号的话,用这个函数也行:function  GetActiveWindowText: string;
    var
      hnd: HWND;
      stlen: Integer;
    begin
      hnd := GetForegroundWindow;
      stlen := GetWindowTextLength(hnd);
      SetLength(Result, stlen);
      GetWindowText(hnd, PChar(Result), stlen+1);
    end;获取当前活动窗体的标题,
    可是QQ的窗体标题没有号码吧
    我没发现...
      

  7.   

    现在都用TXGuiFoundation控件封装了。QQ号码恐怕难道取到了。
      

  8.   

    现在QQ是2009版了,在标题中没有QQ号码。还有其它的方法吗?
      

  9.   

    获取右下角的QQ小图标,里面的TIP有QQ号。
      

  10.   

    很简单的,用FindWindow获取出来就可以了。
      

  11.   

    腾讯没那么傻,读标题就能读出来读内存,那里有或者QQ的安装目,里面有些文件根据时间可以有个大概了解登陆的QQ时间是最新的,而且会变化
      

  12.   

    没看俺的QQ外挂原理?
    QQ2008用GetCurrentUin
    QQ2009用Contact管理的GetSelfUin函数
      

  13.   

    去看高人的blog去了,好好学习
      

  14.   

    用spy看了一下QQ进程里有个窗口的标题含当前的QQ号吗
    其中一个窗口的标题为 “QQ号_QQMusic_SmallClient”
    另一个为比较长,有uuid的字符串
    可以遍历查找一下标题包含那些字符串的,但不知道各个版本是否有区别
      

  15.   

    如果QQ在托盘显示,那么就可以在托盘中查找到uses CommCtrl,ShellAPI;{获取托盘句柄的函数}
    function TrayHWnd: HWND;
    var
      h,hTmp: HWND;
    begin
      h := FindWindow('Shell_TrayWnd', nil);
      h := FindWindowEx(h, 0, 'TrayNotifyWnd', nil);
      hTmp := FindWindowEx(h, 0, 'SysPager', nil);
      if hTmp <> 0 then h := hTmp;
      hTmp := FindWindowEx(h, 0, 'ToolbarWindow32', nil);
      if hTmp <> 0 then h := hTmp;
      Result := h;
    end;{控件初始化}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListView1.Align := alLeft;
      ListView1.Columns.Add;
      ListView1.Columns.Items[0].Caption := '托盘图标列表';
      ListView1.Columns.Items[0].Width := 500;
      Listview1.ViewStyle := vsReport;  Button1.Caption := '显示托盘列表';
    end;{提取列表}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      h: HWND;
      count,size,num: Cardinal;
      pid, ph: Cardinal;
      p: Pointer;
      icoBtn: TTBButton;
      buf: array[0..255] of WideChar;
      i: Integer;
      item: TListItem;
    begin
      h := TrayHWnd;
      count := SendMessage(h, TB_BUTTONCOUNT, 0, 0);
      size := SizeOf(TTBButton);  GetWindowThreadProcessId(h, pid);
      ph := OpenProcess(PROCESS_VM_READ, False, pid);  for i := 0 to count - 1 do
      begin
        SendMessage(h, TB_GETBUTTON, i, DWORD(p));
        ReadProcessMemory(ph, p, @icoBtn, size, num);
        ReadProcessMemory(ph, Pointer(icoBtn.iString), @buf, Length(buf)*SizeOf(buf[0]), num);
        item := ListView1.Items.Add;
        item.Caption := buf;
      end;
      CloseHandle(ph);  Button2.Enabled := True;
      Button3.Enabled := True;
    end;
      

  16.   

    上面的代码获取QQ2008是没问题的,不知道获取QQ2009的行不。
    另外获取后进行筛选,只筛选名字为QQ+数字的,且数字长度>=5
      

  17.   

    楼上
    这种方法能检测到,但还是有些问题
    1、当QQ来消息时就检测不到了
    2、当把QQ离线而不退出,还是能检测到,不知怎样解决?
      

  18.   

    通过下面这一段可取得托盘中的QQ及其号码,但现在我想得到每一个号码实例的句柄,要怎么取得呢?目的是为了判断当前电脑是否启动了不应该启动的QQ号,如果发现有,则强行关闭它。这样就可避免
    当前电脑上一些不许可的QQ号了。找高手,给个指导!!!uses CommCtrl,ShellAPI;var id: array[0..100] of integer;{$R *.dfm}procedure TFrmTray.FormCreate(Sender: TObject);
    var
      v_hShellTray: THandle;
      v_hTrayNotify: THandle;
      v_hToolBar: THandle;
      v_SysPager: THandle;
      i, j, k: integer;
      Info: _TBBUTTON;
      buffer: pchar;
      PID: THandle;
      PRC: THandle;
      R: Cardinal;
      S: array[0..1024] of char;
      MaxWidth: integer;
    begin
      k := 0;
      CheckListBox1.Items.Clear;
      v_hShellTray := FindWindow('Shell_TrayWnd', nil);
      v_hTrayNotify := FindWindowEx(v_hShellTray, 0, 'TrayNotifyWnd', nil);
      v_SysPager := FindWindowEx(v_hTrayNotify, 0, 'SysPager', nil);
      v_hToolBar := FindWindowEx(v_SysPager, 0, 'ToolbarWindow32', nil);
      if v_hToolBar=0 then Exit;
      
      GetWindowThreadProcessId(v_hToolBar, @PID);
      PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
      Buffer := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);  j := SendMessage(v_hToolBar, TB_BUTTONCOUNT, 0, 0);
      for i := 0 to j - 1 do
      begin
        FillChar(Info, SizeOf(Info), 0);
        WriteProcessMemory(PRC, Buffer, @Info, SizeOf(Info), R);    SendMessage(v_hToolBar, TB_GETBUTTON, i, integer(Buffer));
        ReadProcessMemory(PRC, Buffer, @Info, SizeOf(Info), R);
        if Info.iString <> -1 then
        begin
          k := k + 1;
          if not Boolean(SendMessage(v_hToolBar, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then
          begin
            SendMessage(v_hToolBar, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buffer[0]) + SizeOf(Info)));
            ReadProcessMemory(PRC, Pointer(integer(@Buffer[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
            id[k - 1] := Info.idCommand;
            CheckListBox1.Items.Add(S);
            CheckListBox1.Checked[k - 1] := false;
          end
          else
          begin
            SendMessage(v_hToolBar, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buffer[0]) + SizeOf(Info)));
            ReadProcessMemory(PRC, Pointer(integer(@Buffer[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
            id[k - 1] := Info.idCommand;
            CheckListBox1.Items.Add(S);
            CheckListBox1.Checked[k - 1] := true;
          end;
        end;
      end;
      VirtualFreeEx(PRC, Buffer, 0, MEM_RELEASE);
      CloseHandle(PRC);  MaxWidth := 0;
      for i := 0 to CheckListBox1.Items.Count - 1 do
        if MaxWidth < CheckListBox1.Canvas.TextWidth(CheckListBox1.Items.Strings[i]) then
          MaxWidth := CheckListBox1.Canvas.TextWidth(CheckListBox1.Items.Strings[i]);
      SendMessage(CheckListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxWidth + 40, 0);
    end;
      

  19.   

    这个简单,首先获取进程列表,然后找QQ.EXE的进程,获取其进程ID,再然后用OpenProcess打开进程,然后读取进程内存,找数据为'\MsgEx.db'的地址,'\MsgEx.db'前面的QQ号就是要获取的QQ号,每个QQ号的聊天记录就是存储在这个文件里的。
      

  20.   

    谢谢 coolfire2007 的回答。但能不能给个具体的例子啊?我不是很懂咧。还有在QQ 2009 下好象就不能这样了。怎么解决呢?
      

  21.   

    要源代码 加我QQ 7633253 coolfire
      

  22.   

    这个问题我已经解决了,看这里吧
    http://user.qzone.qq.com/2975273/infocenter?ptlang=2052&ADUIN=2975273&ADSESSION=1262652291&ADTAG=CLIENT.QQ.2653_Mysrv.0