下面给出获取所有托盘图标的hint,但是要怎么样才可以通过这个获取到对应的进程PID呢,高手请帮忙 ,小弟感激不尽!
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.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;
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.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;
解决方案 »
- 急切想知道数据库副本的创建,及其应用,以及保存到母本方法?
- 设置注册表自动运行 CreateProcess失效
- 如何从主程序向带窗体的DLL中传入变量和从DLL向主程序传变量.
- 寻求能兼职或远程工作的Delphi/C#/Win32/.NET高手交流
- couldn't perform the edit because another user changed the record?? 急
- 两个初级问题,如何加载activeX和dll控件
- quickrep中,在什么地方可以判断到了当前记录集的最后一条?
- 一个很简单的,请看一下,好吗?用QUERY实行INSERT UPDATE DELETE 竟然实现不了
- 求大侠,急救,socket 多线程问题
- 想写个dll库,里面会使用TClientSocket,但不用TFORM怎样使用?
- php怎么与delphi交互
- 最近很闹心,被个DELPHI代理公司以打盗版的名义盯上了!
还有个小问题,就是应当事先分配内存p。以下红色部分是新增加的内容。
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;
dwData: DWORD;
begin
h := TrayHWnd;
count := SendMessage(h, TB_BUTTONCOUNT, 0, 0);
size := SizeOf(TTBButton); GetWindowThreadProcessId(h, pid);
ph := OpenProcess(PROCESS_VM_READ {or PROCESS_VM_WRITE} or PROCESS_VM_OPERATION, False, pid);
p := VirtualAllocEx(ph, nil, size, MEM_COMMIT, PAGE_READWRITE); 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);
ReadProcessMemory(ph, Pointer(icoBtn.dwData), @dwData, SizeOf(dwData), num);
GetWindowThreadProcessId(dwData, pid);
item := ListView1.Items.Add;
item.Caption := buf;
item.SubItems.Add(IntToStr(pid))
end;
VirtualFreeEx(ph, nil, 0, MEM_RELEASE);
CloseHandle(ph); Button2.Enabled := True;
Button3.Enabled := True;
end;