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

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

如何枚举包含工具提示的系统托盘图标?

解决方法

这是我用windows xp和delphi 2010测试的方法,如果你使用的是delphi版本,不支持unicode make shure你将字符串读取转换为ansi
uses CommCtrl;

function TForm1.GetIconsCount: Integer;
begin
  Result := SendMessage(FindTrayToolbar,TB_BUTTONCOUNT,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    ListTips;
end;

function TForm1.FindTrayToolbar: HWND;
begin
  Result := FindWindow('Shell_TrayWND',nil);
  Result := findwindowex(Result,'TrayNotifyWnd','SysPager','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.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...