Delphi 如何获取通知区域图标的工具提示?

Delphi 如何获取通知区域图标的工具提示?,delphi,delphi-2007,notification-area,Delphi,Delphi 2007,Notification Area,我可以在通知区域中用图标枚举应用程序(句柄、pid、路径),我可以控制图标的位置,但我无法获得工具提示 如何枚举包括工具提示在内的systray图标?shell不提供检查不属于您的程序的通知图标的工具。(它甚至无法列举属于您的程序的图标;您应该已经知道了这些图标。) 我曾经使用过一个程序,它劫持了一些或所有的图标,并选择性地将它们显示在自己的窗口中,而不是在时钟附近的区域中,因此它一定能够获得所有图标的列表。这是Mike Lin写的。如果你想知道他的黑客行为是如何运作的,你可以找到消息来源 您还

我可以在通知区域中用图标枚举应用程序(句柄、pid、路径),我可以控制图标的位置,但我无法获得工具提示


如何枚举包括工具提示在内的systray图标?

shell不提供检查不属于您的程序的通知图标的工具。(它甚至无法列举属于您的程序的图标;您应该已经知道了这些图标。)

我曾经使用过一个程序,它劫持了一些或所有的图标,并选择性地将它们显示在自己的窗口中,而不是在时钟附近的区域中,因此它一定能够获得所有图标的列表。这是Mike Lin写的。如果你想知道他的黑客行为是如何运作的,你可以找到消息来源


您还可以查看前一个问题的答案。

您应该查看madshis组件集合。它有一些接口。但要注意:

使用madKernel,您可以管理任何应用程序的托盘图标(请参阅API“Shell\u NotifyIcon”)。这种功能完全没有文档记录,但从win95到winXP都可以正常工作


ITrayIcon界面具有提示、图标、位置等属性

下面是我在windows xp和delphi 2010上测试的方法,如果您使用的是不支持unicode的delphi版本,请让舒尔将读取的字符串转换为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.
使用CommCtrl;
函数TForm1.GetIConCount:整数;
开始
结果:=SendMessage(FindTrayToolbar,TB_按钮计数,0,0);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
列表提示;
结束;
函数TForm1.FindTrayToolbar:HWND;
开始
结果:=FindWindow('Shell_TrayWND',无);
结果:=FindWindowEx(结果,0,'TrayNotifyWnd',nil);
结果:=FindWindowEx(结果,0,'SysPager',nil);
结果:=FindWindowEx(结果,0,'ToolbarWindow32',nil);
结束;
程序TForm1.ListTips;
变量
德沃德;
wndTray:HWND;
hTray:THandle;
远程托盘:指针;
tdata:TTBBUTTON;
i:整数;
btsread:DWORD;
str:Pchar;
开始
wndTray:=FindTrayToolbar;
GetWindowThreadProcessId(wndTray,@dwTray);
hTray:=OpenProcess(PROCESS\u ALL\u ACCESS,false,dwTray);
如果hTray为0,那么
开始
remoteTray:=VirtualAllocEx(hTray、nil、Sizeof(tdata)、MEM_COMMIT、,
页面(读写);
对于i:=0的GetIConCount-1 do
开始
SendMessage(FindTrayToolbar、TB_GETBUTTON、wparam(i)、LPRAM(remotetray));
ReadProcessMemory(hTray、remotetray、@tdata、sizeof(tdata)、btsread);
GetMem(str,255);
ReadProcessMemory(hTray、Ptr(tdata.iString)、str、255、btsread);
列表框1.Items.Add(str);
结束;
结束
else ShowMessage('找不到托盘图标');
结束;
结束。

我可以列举系统中的图标,我可以列举应用程序(句柄、pid、路径),我可以控制图标的位置。但是我不能得到工具提示。这就是我想知道的。你可以在问题中提到这一点:“我可以列举图标,但无法获得工具提示。这是我正在使用的代码。请帮我填空。”你读了我给你的第二个链接了吗?是的,我读了第二个链接。我可以控制通知区域中的图标。但这是另一个故事。使用相同的代码或多或少我可以枚举系统托盘中的图标。(翻译自)但是我不能得到他们的工具提示。