用Delphi编程如何判断电脑中运行的QQ号是多少? 用Delphi编程如何判断电脑中运行的QQ号是多少? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主要盗Q号?\QQ2009\Users下面有几个目录,用过的Q号都在里面。想获取当前正在用的Q号可以用GetActiveWindow在发现有QQ登陆对话框时HOOK键盘,密码是HOOK不到的,腾讯防了这一手,HOOK到的不是用户输入的密码。 如果退出QQ时没有设置删除全部,一般在qq安装目录下有个文件夹是以登录过的qq号命名的文件夹,可以研究一下。 LZ你获取到当前QQ好以后呢 ?、下一步你想干啥??? 我做了个软件,想用QQ号来验证用户身份。就是检测到QQ号已登录了就可以使用软件。 获取窗体标题。标题上就有显示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; 如果窗体标题有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的窗体标题没有号码吧我没发现... 现在都用TXGuiFoundation控件封装了。QQ号码恐怕难道取到了。 现在QQ是2009版了,在标题中没有QQ号码。还有其它的方法吗? 获取右下角的QQ小图标,里面的TIP有QQ号。 很简单的,用FindWindow获取出来就可以了。 腾讯没那么傻,读标题就能读出来读内存,那里有或者QQ的安装目,里面有些文件根据时间可以有个大概了解登陆的QQ时间是最新的,而且会变化 没看俺的QQ外挂原理?QQ2008用GetCurrentUinQQ2009用Contact管理的GetSelfUin函数 去看高人的blog去了,好好学习 用spy看了一下QQ进程里有个窗口的标题含当前的QQ号吗其中一个窗口的标题为 “QQ号_QQMusic_SmallClient”另一个为比较长,有uuid的字符串可以遍历查找一下标题包含那些字符串的,但不知道各个版本是否有区别 如果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; 上面的代码获取QQ2008是没问题的,不知道获取QQ2009的行不。另外获取后进行筛选,只筛选名字为QQ+数字的,且数字长度>=5 楼上这种方法能检测到,但还是有些问题1、当QQ来消息时就检测不到了2、当把QQ离线而不退出,还是能检测到,不知怎样解决? 通过下面这一段可取得托盘中的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; 这个简单,首先获取进程列表,然后找QQ.EXE的进程,获取其进程ID,再然后用OpenProcess打开进程,然后读取进程内存,找数据为'\MsgEx.db'的地址,'\MsgEx.db'前面的QQ号就是要获取的QQ号,每个QQ号的聊天记录就是存储在这个文件里的。 谢谢 coolfire2007 的回答。但能不能给个具体的例子啊?我不是很懂咧。还有在QQ 2009 下好象就不能这样了。怎么解决呢? 要源代码 加我QQ 7633253 coolfire 这个问题我已经解决了,看这里吧http://user.qzone.qq.com/2975273/infocenter?ptlang=2052&ADUIN=2975273&ADSESSION=1262652291&ADTAG=CLIENT.QQ.2653_Mysrv.0 delphi dbtreeview 小问题 急!!! INDY9->INDY10代码转换问题。。 怎么把Unicode 转成ASCII 报表转换成EXCEL 各位老大帮忙啊!!!!,又是DLL的问题 怎样让DbLookupComboBox有默选项? 怎么把text文件的指针移动若干行?立即给分。 如何在dxdbgrid中保存数据库查出的数据 CSDN好大的BUG!丢脸啊! 为什么我用ADOQUERY.DELETE命令删除结果集中仅有的一条记录时会报错? 如何在dephi7环境下实现动态生成网页文件? dbgrid 批量录入 请各位帮忙
\QQ2009\Users下面有几个目录,用过的Q号都在里面。
想获取当前正在用的Q号可以用GetActiveWindow在发现有QQ登陆对话框时HOOK键盘,
密码是HOOK不到的,腾讯防了这一手,HOOK到的不是用户输入的密码。
就是检测到QQ号已登录了就可以使用软件。
标题上就有显示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;
var
hnd: HWND;
stlen: Integer;
begin
hnd := GetForegroundWindow;
stlen := GetWindowTextLength(hnd);
SetLength(Result, stlen);
GetWindowText(hnd, PChar(Result), stlen+1);
end;获取当前活动窗体的标题,
可是QQ的窗体标题没有号码吧
我没发现...
QQ2008用GetCurrentUin
QQ2009用Contact管理的GetSelfUin函数
其中一个窗口的标题为 “QQ号_QQMusic_SmallClient”
另一个为比较长,有uuid的字符串
可以遍历查找一下标题包含那些字符串的,但不知道各个版本是否有区别
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;
另外获取后进行筛选,只筛选名字为QQ+数字的,且数字长度>=5
这种方法能检测到,但还是有些问题
1、当QQ来消息时就检测不到了
2、当把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;
http://user.qzone.qq.com/2975273/infocenter?ptlang=2052&ADUIN=2975273&ADSESSION=1262652291&ADTAG=CLIENT.QQ.2653_Mysrv.0