You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:11:06