如何用AutoIT获取Windows系统托盘内的运行程序?
如何用AutoIT获取Windows系统托盘内的程序
可以实现,AutoIT本身没有原生的托盘图标枚举函数,但可以通过调用Windows API或者遍历系统托盘的控件结构来获取相关信息。以下是两种可行的实现方式:
方法一:遍历系统托盘控件并提取信息
系统托盘的核心窗口是Shell_TrayWnd,其下的TrayNotifyWnd子窗口包含所有托盘图标控件。通过遍历这些控件,可以获取每个图标的相关属性(如工具提示文本、关联进程等)。
示例代码:
#include <WinAPI.au3> #include <WindowsConstants.au3> ; 获取系统托盘的主窗口句柄 Local $hTray = WinGetHandle("[CLASS:Shell_TrayWnd]") If Not $hTray Then Exit MsgBox(0, "错误", "未找到系统托盘窗口") ; 获取TrayNotifyWnd子窗口句柄 Local $hNotify = ControlGetHandle($hTray, "", "[CLASS:TrayNotifyWnd]") If Not $hNotify Then Exit MsgBox(0, "错误", "未找到托盘通知窗口") ; 获取TrayNotifyWnd下的所有子控件(每个托盘图标对应一个控件) Local $aControls = WinGetControls($hNotify) If @error Then Exit MsgBox(0, "错误", "无法获取托盘控件列表") ; 遍历每个控件,提取工具提示信息 For $hControl In $aControls ; 获取控件的工具提示文本 Local $sTooltip = _WinAPI_GetWindowText($hControl) If $sTooltip <> "" Then ConsoleWrite("托盘图标提示:" & $sTooltip & @CRLF) EndIf ; 可选:获取关联的进程ID Local $dwProcessId = 0 _WinAPI_GetWindowThreadProcessId($hControl, $dwProcessId) If $dwProcessId > 0 Then ConsoleWrite("关联进程ID:" & $dwProcessId & @CRLF) EndIf Next
方法二:使用AutoIT UDF简化操作
AutoIT社区提供的TrayIcon.au3 UDF封装了托盘图标的枚举逻辑,可直接调用相关函数获取托盘程序信息。
示例代码(需引入TrayIcon.au3):
#include "TrayIcon.au3" ; 枚举所有托盘图标 Local $aTrayIcons = _TrayIcon_GetIcons() If @error Then Exit MsgBox(0, "错误", "无法枚举托盘图标") ; 输出每个图标的信息 For $i = 1 To $aTrayIcons[0][0] ConsoleWrite("程序名称:" & $aTrayIcons[$i][0] & @CRLF) ConsoleWrite("进程ID:" & $aTrayIcons[$i][1] & @CRLF) ConsoleWrite("窗口句柄:" & $aTrayIcons[$i][2] & @CRLF & @CRLF) Next
注意事项
- 部分托盘图标可能处于隐藏状态(点击托盘箭头后显示的图标),需要先展开隐藏托盘区域才能完整枚举。
- 若工具提示文本为空,可通过进程ID调用
ProcessNameGet($dwProcessId)函数查询对应进程名称。
内容的提问来源于stack exchange,提问作者Luca23401
相关产品推荐
相关产品推荐

