我可以在通知区域中使用图标枚举应用程序(句柄,pid,路径),我可以控制图标的位置,但我无法获得工具提示。
如何枚举包含工具提示的系统托盘图标?
答案 0 :(得分:4)
shell不提供检查不属于您的程序的通知图标的工具。 (并且它甚至无法枚举做属于您的程序的图标;您应该已经知道这些图标。)
我以前使用的程序劫持了部分或全部图标,并可选择将它们显示在自己的窗口而不是时钟附近区域,因此它必须能够获得所有图标的列表。 Mike Lin是TraySaver。如果您希望了解他的黑客工作方式,可以使用该来源。
您还可以查看上一个询问controlling the position of icons in the notification area的问题的答案。
答案 1 :(得分:2)
您应该查看madshis组件集合的madKernal package。它有working with trayicons的一些接口。但请注意:
使用madKernel,您可以管理任何应用程序的托盘图标(请参阅API“Shell_NotifyIcon”)。这种功能完全没有记录,但从win95到winXP运行良好。
ITrayIcon接口具有提示,图标,位置等属性。
答案 2 :(得分:1)
这是我用windows xp和delphi 2010测试的方法,如果你使用的是delphi版本,不支持unicode make shure你将字符串读取转换为ansi
uses CommCtrl;
function TForm1.GetIconsCount: Integer;
begin
Result := SendMessage(FindTrayToolbar, TB_BUTTONCOUNT, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListTips;
end;
function TForm1.FindTrayToolbar: HWND;
begin
Result := FindWindow('Shell_TrayWND', nil);
Result := FindWindowEx(Result, 0, 'TrayNotifyWnd', nil);
Result := FindWindowEx(Result, 0, 'SysPager', nil);
Result := FindWindowEx(Result, 0, 'ToolbarWindow32', nil);
end;
procedure TForm1.ListTips;
var
dwTray: DWORD;
wndTray: HWND;
hTray: THandle;
remoteTray: Pointer;
tdata: TTBBUTTON;
i: Integer;
btsread:DWORD;
str:Pchar;
begin
wndTray := FindTrayToolbar;
GetWindowThreadProcessId(wndTray, @dwTray);
hTray := OpenProcess(PROCESS_ALL_ACCESS, false, dwTray);
if hTray <> 0 then
begin
remoteTray := VirtualAllocEx(hTray, nil, Sizeof(tdata), MEM_COMMIT,
PAGE_READWRITE);
for i := 0 to GetIconsCount - 1 do
begin
SendMessage(FindTrayToolbar,TB_GETBUTTON,wparam(i),lparam(remotetray));
ReadProcessMemory(hTray,remotetray,@tdata,sizeof(tdata),btsread);
GetMem(str,255);
ReadProcessMemory(hTray,Ptr(tdata.iString),str,255,btsread);
ListBox1.Items.Add(str);
end;
end
else ShowMessage('Could not locate tray icons');
end;
end.