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

前端之家收集整理的这篇文章主要介绍了delphi – 如何获取通知区域图标的工具提示?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以在通知区域中使用图标枚举应用程序(句柄,pid,路径),我可以控制图标的位置,但我无法获得工具提示.

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

解决方法

这是我用windows xp和delphi 2010测试的方法,如果你使用的是delphi版本,不支持unicode make shure你将字符串读取转换为ansi
  1. uses CommCtrl;
  2.  
  3. function TForm1.GetIconsCount: Integer;
  4. begin
  5. Result := SendMessage(FindTrayToolbar,TB_BUTTONCOUNT,0);
  6. end;
  7.  
  8. procedure TForm1.Button1Click(Sender: TObject);
  9. begin
  10. ListTips;
  11. end;
  12.  
  13. function TForm1.FindTrayToolbar: HWND;
  14. begin
  15. Result := FindWindow('Shell_TrayWND',nil);
  16. Result := FindWindowEx(Result,'TrayNotifyWnd','SysPager','ToolbarWindow32',nil);
  17. end;
  18.  
  19. procedure TForm1.ListTips;
  20. var
  21. dwTray: DWORD;
  22. wndTray: HWND;
  23. hTray: THandle;
  24. remoteTray: Pointer;
  25. tdata: TTBBUTTON;
  26. i: Integer;
  27. btsread:DWORD;
  28. str:Pchar;
  29. begin
  30. wndTray := FindTrayToolbar;
  31. GetWindowThreadProcessId(wndTray,@dwTray);
  32. hTray := OpenProcess(PROCESS_ALL_ACCESS,false,dwTray);
  33. if hTray <> 0 then
  34. begin
  35. remoteTray := VirtualAllocEx(hTray,nil,Sizeof(tdata),MEM_COMMIT,PAGE_READWRITE);
  36. for i := 0 to GetIconsCount - 1 do
  37. begin
  38. SendMessage(FindTrayToolbar,TB_GETBUTTON,wparam(i),lparam(remotetray));
  39. ReadProcessMemory(hTray,remotetray,@tdata,sizeof(tdata),btsread);
  40. GetMem(str,255);
  41. ReadProcessMemory(hTray,Ptr(tdata.iString),str,255,btsread);
  42. ListBox1.Items.Add(str);
  43. end;
  44. end
  45. else ShowMessage('Could not locate tray icons');
  46. end;
  47. end.

猜你在找的Delphi相关文章