用Delphi编程如何判断电脑中运行的QQ号是多少?
解决方案 »
- 还是stringgrid??(急)
- 简单财务系统,数据表的设计问题!资产负债表,损益表,现金流量表.
- adoquery可以指向指定的记录吗?
- 关于PopupMenu菜单位置的问题
- ICopyHook是对文件夹的,对文件拷贝的外壳扩展接口是什么?
- createoleobject函数不可以在dll里调用?(来者有分)
- 将工具栏设为不可见,近日做DelPhi编程,麻烦一堆接一堆,好多问题,大家来帮帮忙吧!只能给100分!
- 这问题很难解决?圆形照片问题
- 闪烁问题:我的几个Form均有大幅的Jpg图片,当我进行Form的Show时,闪烁很厉害,有什么办法消除??
- Delphi 6中关于MainMenu的一个奇怪的问题
- 如何在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