<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1632085368384154" crossorigin="anonymous"></script><script src="https://autohotkey.top/gtag.js"></script></head> <body> <h1>Menu</h1> <p>创建, 删除, 修改和显示菜单和菜单项. 改变托盘图标和它的提示. 控制是否可以打开<a href="Scripts.htm#ahk2exe">已编译脚本</a>的主窗口.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, <a href="#SubCommands">SubCommand</a> <span class="optional">, Value1, Value2, Value3, Value4</span></pre> <p><em>MenuName</em> 参数可以是 <code>Tray</code> 或任何自定义菜单的名称. 自定义菜单在第一次使用 <a href="#Add">Add</a> 子命令时自动创建. 例如: <code>Menu, MyMenu, Add, Item1</code>. 创建后, 可以使用 <a href="#Show">Show</a> 子命令显示自定义菜单. 它也可以通过 <a href="#Add">Add</a> 子命令作为子菜单附加到一个或多个其他菜单上.</p> <p><em>SubCommand</em>, <em>Value1</em>, <em>Value2</em>, <em>Value3</em> 和 <em>Value4</em> 参数相互依赖, 它们的用法如下所述.</p> <h2 id="toc">目录</h2> <ul> <li><a href="#SubCommands">子命令</a></li> <li><a href="#MenuItemName"><em>MenuItemName</em> 参数</a></li> <li><a href="#Win32_Menus">Win32 菜单</a></li> <li><a href="#Remarks">备注</a></li> <li><a href="#Related">相关</a></li> <li><a href="#Examples">示例</a></li> </ul> <h2 id="SubCommands">子命令</h2> <p>对于 <em>SubCommand</em>, 指定以下命令之一:</p> <ul> <li><a href="#Add">Add</a>: 添加一个菜单项, 用一个新的子菜单或标签更新一个菜单项, 或把普通菜单转换成子菜单(或相反).</li> <li><a href="#Insert">Insert</a> <span class="ver">[v1.1.23+]</span>: 在指定的菜单项前插入一个新的菜单项.</li> <li><a href="#Delete">Delete</a>: 从菜单中删除指定的菜单项.</li> <li><a href="#DeleteAll">DeleteAll</a>: 从菜单中删除所有自定义菜单项.</li> <li><a href="#Rename">Rename</a>: 重命名指定的菜单项.</li> <li><a href="#Check">Check</a>: 在指定的菜单项前添加复选标记.</li> <li><a href="#Uncheck">Uncheck</a>: 从指定的菜单项中删除复选标记.</li> <li><a href="#ToggleCheck">ToggleCheck</a>: 向指定的菜单项添加一个复选标记; 如果已经有了, 则删除它.</li> <li><a href="#Enable">Enable</a>: 启用指定的菜单项(如果之前已禁用).</li> <li><a href="#Disable">Disable</a>: 禁用指定的菜单项.</li> <li><a href="#ToggleEnable">ToggleEnable</a>: 禁用指定的菜单项; 如果已经禁用, 则启用.</li> <li><a href="#Default">Default</a>: 将菜单的默认项更改为指定的菜单项, 并使其字体加粗.</li> <li><a href="#NoDefault">NoDefault</a>: 反向设置用户定义的默认菜单项.</li> <li><a href="#Standard">Standard</a>: 在菜单底部插入标准菜单项.</li> <li><a href="#NoStandard">NoStandard</a>: 从菜单中删除所有标准菜单项.</li> <li><a href="#Icon">Icon</a>: 更改脚本的托盘图标或 <span class="ver">[AHK_L 17+]</span> 设置指定菜单项的图标.</li> <li><a href="#NoIcon">NoIcon</a>: 删除托盘图标或 <span class="ver">[AHK_L 17+]</span> 从指定的菜单项中删除图标.</li> <li><a href="#Tip">Tip</a>: 更改托盘图标的工具提示.</li> <li><a href="#Show">Show</a>: 显示指定的菜单.</li> <li><a href="#Color">Color</a>: 改变菜单的背景颜色.</li> <li><a href="#Click">Click</a>: 设置点击次数以激活托盘菜单的默认菜单项.</li> <li><a href="#MainWindow">MainWindow</a>: 允许通过托盘图标打开脚本的主窗口.</li> <li><a href="#NoMainWindow">NoMainWindow</a>: 防止脚本的主窗口通过托盘图标打开.</li> <li><a href="#UseErrorLevel">UseErrorLevel</a>: 当菜单命令生成错误时, 跳过任何警告对话框和线程终止.</li> </ul> <h3 id="Add">Add</h3> <p>添加一个菜单项, 用一个新的子菜单或标签更新一个菜单项, 或把普通菜单转换成子菜单(或相反).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Add <span class="optional">, MenuItemName, LabelOrSubmenu, Options</span></pre> <p>这是一个多用途子命令. <em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>). 如果 <em>MenuItemName</em> 还不存在, 则把它添加到菜单. 否则, 将使用新指定的 <em>LabelOrSubmenu</em> 更新 <em>MenuItemName</em>.</p> <p>要添加菜单分隔线, 请省略所有三个参数.</p> <p>当用户选择菜单项时, 标签子程序作为新<a href="../misc/Threads.htm">线程</a>运行(类似于 <a href="Gosub.htm">Gosub</a> 和<a href="../Hotkeys.htm">热键子程序</a>). 如果省略 <em>LabelOrSubmenu</em>, 那么将使用 <em>MenuItemName</em> 同时作为标签和菜单项的名称.</p> <p id="Functor"><span class="ver">[v1.1.20+]:</span> 如果不存在这个名称的标签, 那么 <em>LabelOrSubmenu</em> 可以是一个函数对象的名称, 或是引用某个<a href="../objects/Functor.htm">函数对象</a>的变量. 例如 , <code>%funcObj%</code> 或 <code>% funcObj</code>. 有关特性完整的演示, 请参阅<a href="#ExBoundFunc">示例 #5</a>. 目前暂不支持其他返回对象的表达式. 另外还可以定义函数可选参数, 例如:</p> <pre><i>FunctionName</i>(ItemName, ItemPos, MenuName)</pre> <p>要让 <em>MenuItemName</em> 变成子菜单(在选择时打开新菜单的菜单项), 请在 <em>LabelOrSubmenu</em> 中指定冒号后面跟着现有自定义菜单的 <em>MenuName</em>. 例如:</p> <pre>Menu, MySubmenu, Add, Item1 Menu, Tray, Add, This menu item is a submenu, :MySubmenu</pre> <p>如果不省略, <em>Options</em> 必须是包含一个或多个下列选项并以空格或制表符分隔的列表:</p> <table class="info"> <tr> <th>选项</th> <th abbr="Descr">描述</th> </tr> <td>P<em>n</em></td> <td><em>n</em> 代表菜单项的<a href="../misc/Threads.htm">线程优先级</a>, 如 <code>P1</code>. 如果在添加菜单项时省略此选项, 其优先级将会是默认的 0 . 如果在更新菜单项时省略此选项, 其优先级不变. 用十进制数字(不是十六进制) 表示优先级.</td> </tr> <tr> <td>+Radio</td> <td><span class="ver">[v1.1.23+]:</span> 选中菜单项时显示的是一个空心圆而不是打勾标志.</td> </tr> <tr> <td>+Right</td> <td><span class="ver">[v1.1.23+]:</span> 让菜单栏中的菜单项右对齐. 此选项仅适用于<a href="Gui.htm#Menu">菜单栏</a>而不是弹出式菜单或子菜单.</td> </tr> <tr> <td>+Break</td> <td><span class="ver">[v1.1.23+]:</span> 让弹出式菜单中的菜单项以新的一列开始.</td> </tr> <tr> <td>+BarBreak</td> <td><span class="ver">[v1.1.23+]:</span> 作用同上, 不过该选项会在列之间加分隔线.</td> </tr> </table> <p>选项中的加号(+) 是可选的也可以用减号(-) 代替用以移除某个选项, 就像 <code>-Radio</code> . 选项不区分大小写.</p> <p>为了不影响菜单项的标签或子菜单, 在改变一个已存在的菜单项的选项时直接忽略 <em>LabelOrSubmenu</em> 参数即可.</p> <h3 id="Insert">Insert <span class="ver">[v1.1.23+]</span></h3> <p>在指定的菜单项前插入一个新的菜单项.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Insert <span class="optional">, MenuItemName, ItemToInsert, LabelOrSubmenu, Options</span></pre> <p>用法同上面的 <a href="#Add">Add</a> 子命令, 除了 <em>MenuItemName</em> 始终是现有菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>), <em>ItemToInsert</em> 是要在 <em>MenuItemName</em> 之前插入的新菜单项的名称. 菜单项也可以通过忽略 <em>MenuItemName</em>(连写两个逗号) 的方式追加. 与 <a href="#Add">Add</a> 子命令不同, Insert 子命令创建一个新的菜单项, 即使 <em>ItemToInsert</em> 与现有菜单项的名称匹配.</p> <h3 id="Delete">Delete</h3> <p>从菜单中删除指定的菜单项.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Delete <span class="optional">, MenuItemName</span></pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>). 标准菜单项例如 "Exit"(请参阅下面) 不能被单独删除. 如果删除了 <em>default</em> 菜单项, 则效果与使用了 <a href="#NoDefault">NoDefault</a> 子命令类似. 如果省略了 <em>MenuItemName</em>, 则会删除整个 <em>MenuName</em> 菜单以及在其他菜单中名称为 <em>MenuName</em> 的任何子菜单项. 删除菜单还会导致当前 <a href="#Win32_Menus">Win32 菜单</a>的父菜单和子菜单的被销毁, 之后在需要时重新创建.</p> <h3 id="DeleteAll">DeleteAll</h3> <p>从菜单中删除所有自定义菜单项.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, DeleteAll</pre> <p>任何现有的标准菜单项(见下文) 仍然不受影响. 与使用 <a href="#Delete">Delete</a> 子命令(见上文) 完全删除菜单不同, 空菜单仍然存在, 因此其他任何包含此菜单项作为子菜单的菜单仍保留这些子菜单.</p> <h3 id="Rename">Rename</h3> <p>重命名指定的菜单项到 <em>NewName</em>.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Rename, MenuItemName <span class="optional">, NewName</span></pre> <p>如果 <em>NewName</em> 为空, 指定的菜单项将被转换为分隔线. <em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>). 菜单项的当前目标标签或子菜单不会改变. <span class="ver">[v1.1.23+]:</span> 可通过指定分隔线的位置&amp; 和一个非空的 <em>NewName</em> 的方式将分隔线转换成正常的菜单项, 随后使用 <a href="#Add">Add</a> 子命令为其指定一个标签或子菜单.</p> <h3 id="Check">Check</h3> <p>在指定的菜单项前添加复选标记(如果还没有).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Check, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="Uncheck">Uncheck</h3> <p>从指定的菜单项中删除复选标记(如果有).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Uncheck, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="ToggleCheck">ToggleCheck</h3> <p>指定的菜单项如果没有复选标记则添加一个复选标记; 如果已经有了, 则删除它.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, ToggleCheck, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="Enable">Enable</h3> <p>允许用户再次选择指定的菜单项, 如果它先前是被禁用(灰色的).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Enable, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="Disable">Disable</h3> <p>将指定的菜单项更改为灰色, 以指示用户无法选择它.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Disable, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="ToggleEnable">ToggleEnable</h3> <p>如果指定的菜单项之前是启用的则禁用; 否则, 启用它.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, ToggleEnable, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="Default">Default</h3> <p>将菜单的默认项更改为指定的菜单项, 并将其字体加粗.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Default <span class="optional">, MenuItemName</span></pre> <p>目前在 TRAY 以外的菜单中设置默认项只是改变外观而没有其他作用. <em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>). 当用户双击托盘图标时, 会运行其默认菜单项. 如果没有默认项, 则双击没有效果. 如果省略了 <em>MenuItemName</em>, 则效果等同于使用了下面的 <a href="#NoDefault">NoDefault</a> 子命令.</p> <h3 id="NoDefault">NoDefault</h3> <p>反向设置用户定义的默认菜单项.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, NoDefault</pre> <p>对于托盘菜单: 让菜单恢复其默认菜单项, 对于未编译脚本为 OPEN, 而对于<a href="../Scripts.htm#ahk2exe">已编译脚本</a>则没有(除非 <a href="#MainWindow">MainWindow</a> 子命令生效). 如果因为之前使用了下面的 <a href="#NoStandard">NoStandard</a> 子命令使得 OPEN 菜单项不存在, 那么将没有默认菜单项, 因此双击托盘图标没有效果. 对于 TRAY 以外的其他菜单: 任何现有的默认项恢复为非加粗字体.</p> <h3 id="Standard">Standard</h3> <p>在菜单底部插入标准菜单项(如果还不存在).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Standard</pre> <p>此子命令可用于托盘菜单或其他任何菜单.</p> <h3 id="NoStandard">NoStandard</h3> <p>从菜单移除所有标准(非自定义) 的菜单项(如果存在).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, NoStandard</pre> <p>此子命令可用于托盘菜单或其他任何菜单.</p> <h3 id="Icon">Icon</h3> <p>作用于<a href="#TrayIcon">托盘图标</a>或在 <span class="ver">[AHK_L 17+]</span> 中<a href="#MenuIcon">菜单项的图标</a>具体取决于下面语法的用法.</p> <h4 id="TrayIcon">设置托盘图标</h4> <p>改变脚本的<a href="../Program.htm#tray-icon">托盘图标</a>为 <em>FileName</em> 中的某个图标.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, Icon <span class="optional">, FileName, IconNumber, 1</span></pre> <p>支持下列的文件类型: ICO, CUR, ANI, EXE, DLL, CPL, SCR 以及包含图标资源的其他类型. 要使用文件中除第一个之外的图标组, 请在 <em>IconNumber</em> 指定它的编号(如果省略, 则它默认为 1). 例如, <strong>2</strong> 将加载第二个图标组中的默认图标. 如果 <em>IconNumber</em> 为负数, 则假定其绝对值表示可执行文件中图标的资源 ID. 在 <em>FileName</em> 指定星号(*) 来恢复脚本到其默认图标.</p> <p>最后一个参数: 在最后一个参数指定 1 来冻结图标, 而 0 则解冻它(或留空来保持冻结/解冻状态不变). 当图标已经冻结时, <a href="Pause.htm">Pause</a> 和 <a href="Suspend.htm">Suspend</a> 不会改变它. 注: 要冻结或解冻 <em>当前的</em> 图标, 请使用 1 或 0, 例如: <code>Menu, Tray, Icon,,, 1</code>.</p> <p>改变托盘图标同时也改变由 <a href="InputBox.htm">InputBox</a>, <a href="Progress.htm">Progress</a> 和后续创建的 <a href="Gui.htm">GUI</a> 窗口显示的图标. 也会影响<a href="../Scripts.htm#ahk2exe">已编译脚本</a>, 即使它在编译时指定了自定义的图标.</p> <p class="note"><strong>注意:</strong> 如果之前使用如 <a href="_NoTrayIcon.htm">#NoTrayIcon</a> 的方法隐藏了托盘图标, 则改变图标不会让它显示出来; 要让它显示, 请使用 <code>Menu, Tray, Icon</code>(不带参数).</p> <p id="distort">从 .ICO 外的其他类型文件中加载托盘图标时可能产生轻微的变形. 尤其是对于 16x16 的图标. 要避免此问题, 请把要使用的托盘图标保存到 .ICO 文件.</p> <p>操作系统的 DLL 和 CPL 文件包含的一些图标可能会有用. 例如: <code>Menu, Tray, Icon, Shell32.dll, 174</code>.</p> <p>内置变量 <strong>A_IconNumber</strong> 和 <strong>A_IconFile</strong> 分别包含了当前图标的编号和名称(带完整路径)(如果为默认图标则两者都为空).</p> <p><span class="ver">[v1.1.23+]:</span> <a href="../misc/ImageHandles.htm">图标句柄</a>可替代文件名. 例如, <code>Menu Tray, Icon, HICON:*%handle%</code>. 星号是必需的, 因为图标必须 "加载" 两次: 一次为小图标, 再次为大图标.</p> <p><span class="ver">[v1.1.27+]:</span> <em>FileName</em> 支持非图标图片文件和<a href="../misc/ImageHandles.htm">位图句柄</a>. 例如, <code>Menu Tray, Icon, HBITMAP:*%handle%</code>.</p> <h4 id="MenuIcon">设置菜单项的图标 <span class="ver">[AHK_L 17+]</span></h4> <p>为指定的菜单项设置一个图标.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Icon, MenuItemName, FileName <span class="optional">, IconNumber, IconWidth</span></pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>). <em>FileName</em> 可以为图标文件或 AutoHotkey 支持的格式的任何图像. 要使用文件中除第一个之外的图标组, 请在 <em>IconNumber</em> 指定它的编号(如果省略, 则它默认为 1). 如果 <em>IconNumber</em> 为负数, 则假定其绝对值表示可执行文件中图标的资源 ID. 在 <em>IconWidth</em> 中指定期望的图标宽度. 如果 <em>IconNumber</em> 表示的图标组包含多种大小的图标, 则使用最接近的匹配并将图标缩放到指定的大小. 请参阅<a href="#ExIcon">示例 #4</a> 的用法示例.</p> <p>当前在 Windows Vista 和更高版本中如果需要被设置的图标保留透明度时, 则必须指定 "真实的大小". 例如:</p> <pre>Menu, <i>MenuName</i>, Icon, <i>MenuItemName</i>, Filename.png,, 0</pre> <p>已知限制: 在 Windows XP 和更早版本中, Gui 菜单栏中的图标无法放置到正确的位置.</p> <p><span class="ver">[v1.1.23+]:</span> <a href="../misc/ImageHandles.htm">位图或图标句柄</a>可替代文件名. 例如, <code>HBITMAP:%handle%</code>.</p> <h3 id="NoIcon">NoIcon</h3> <p>作用于<a href="#RemoveTrayIcon">托盘图标</a>或在 <span class="ver">[AHK_L 17+]</span> 中<a href="#RemoveMenuIcon">菜单项的图标</a>, 具体取决于下面的语法的用法.</p> <h4 id="RemoveTrayIcon">移除托盘图标</h4> <p>如果存在托盘图标则移除它.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, NoIcon</pre> <p>如果在脚本的最顶部使用此子命令, 那么当脚本启动时, 托盘图标可能会短暂地显示出来. 要避免这种情况, 请使用 <a href="_NoTrayIcon.htm">#NoTrayIcon</a>. 如果托盘图标当前是隐藏的, 则内置变量 <strong>A_IconHidden</strong> 的值为 1, 否则为 0.</p> <h4 id="RemoveMenuIcon">移除菜单项的图标 <span class="ver">[AHK_L 17+]</span></h4> <p>从指定的菜单项中删除图标(如果有的话).</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, NoIcon, MenuItemName</pre> <p><em>MenuItemName</em> 是菜单项的名称或位置(详细信息请参阅 <a href="#MenuItemName">MenuItemName</a>).</p> <h3 id="Tip">Tip</h3> <p>改变托盘图标的工具提示.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, Tip <span class="optional">, Text</span></pre> <p>托盘图标的工具提示是在鼠标悬停在托盘图标上时显示的. 要创建多行的工具提示, 请在每行之间使用换行符(`n), 例如 Line1`nLine2. 仅显示 <em>Text</em> 中的前 127 个字符, 并且如果 <em>Text</em> 中存在 tab 字符, 则首个此字符后的内容被截除. 如果忽略 <em>Text</em>, 工具提示将恢复到默认文本. 内置变量 <strong>A_IconTip</strong> 包含工具提示的当前文本(如果文本处于默认状态, 则为空).</p> <h3 id="Show">Show</h3> <p>显示 <em>MenuName</em>.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Show <span class="optional">, X, Y</span></pre> <p>允许用户使用方向键, 菜单快捷键(下划线字母) 或鼠标选择菜单项. 可以显示包括托盘菜单在内的任何菜单, 但 <a href="Gui.htm">GUI</a> 菜单栏除外. 如果同时省略 X 和 Y, 则菜单显示在鼠标光标的当前位置. 如果仅省略其中一个, 则用鼠标光标的位置代替省略的这个. X 和 Y 相对于活动窗口. 预先指定 "<a href="CoordMode.htm">CoordMode</a>, Menu" 可以让它们相对于整个屏幕.</p> <h3 id="Color">Color</h3> <p>改变菜单的背景颜色为 <em>ColorValue</em>.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, Color, ColorValue <span class="optional">, Single</span></pre> <p><em>ColorValue</em> 是 16 种 HTML 基础颜色之一或 6 位的 RGB 颜色值(请参阅<a href="Progress.htm#colors">颜色图标</a>). 将 <em>ColorValue</em> 留空(或指定单词 Default) 来恢复菜单的默认颜色. 如果单词 Single 没有作为下一个参数出现, 则任何附加到此菜单的子菜单都会改变颜色.</p> <h3 id="Click">Click</h3> <p>设置点击次数以激活托盘菜单的默认菜单项.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, Click, ClickCount</pre> <p>在 <em>ClickCount</em> 中指定 1 来允许单击激活托盘菜单的默认菜单项. 在 <em>ClickCount</em> 中指定 2 来恢复到默认行为(双击). 例如: <code>Menu, Tray, Click, 1</code>.</p> <h3 id="MainWindow">MainWindow</h3> <p>允许通过托盘图标打开脚本的<a href="../Program.htm#main-window">主窗口</a>, 在默认情况下, <a href="../Scripts.htm#ahk2exe">编译</a>或<a href="../Program.htm#embedded-scripts">嵌入</a>的脚本是无法打开的.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, MainWindow</pre> <p>这个子命令恢复了托盘菜单中的 "Open" 选项, 除非使用了 <a href="#NoStandard">NoStandard</a> 子命令, 它还可以启用主窗口的 "View" 菜单中的项目,如 "Lines most recently executed(最近执行的行)", 它允许查看脚本的源代码和其他信息.</p> <p>对于既没有<a href="../Scripts.htm#ahk2exe">编译</a>也没有<a href="../Program.htm#embedded-scripts">嵌入</a>的脚本, 这种模式是默认的.</p> <h3 id="NoMainWindow">NoMainWindow</h3> <p>防止通过托盘图标打开<a href="../Program.htm#main-window">主窗口</a>.</p> <pre class="Syntax"><span class="func">Menu</span>, Tray, NoMainWindow</pre> <p>这个子命令从托盘菜单中移除标准的 "Open" 选项. 它也禁用了主窗口的 View 菜单中的项目, 如 "Lines most recently executed". 然而, 当脚本运行时遇到下列命令时, 它们仍然能够显示主窗口并激活相应的视图选项: <a href="ListLines.htm">ListLines</a>, <a href="ListVars.htm">ListVars</a>, <a href="ListHotkeys.htm">ListHotkeys</a> 和 <a href="KeyHistory.htm">KeyHistory</a>.</p> <p>这个子命令并不妨碍主窗口被 <a href="WinShow.htm">WinShow</a> 显示或被 <a href="ControlGetText.htm">ControlGetText</a> 或类似的方法检查, 但它确实阻止了脚本的源代码和其他信息通过主窗口暴露出来, 除非脚本调用了上述的某个命令.</p> <p>这种模式对于已经<a href="../Scripts.htm#ahk2exe">编译</a>或<a href="../Program.htm#embedded-scripts">嵌入</a>的脚本来说是默认的.</p> <p><span class="ver">[v1.1.34+]:</span> 这个子命令甚至可以在未编译的脚本中使用.</p> <h3 id="UseErrorLevel">UseErrorLevel</h3> <p>当菜单命令生成错误时, 跳过任何警告对话框和线程终止.</p> <pre class="Syntax"><span class="func">Menu</span>, MenuName, UseErrorLevel <span class="optional">, Off</span></pre> <p>如果脚本中从未使用过此选项, 则它默认为 OFF. 每当 Menu 命令遇到错误时, OFF 设置会显示一个对话框并终止<a href="../misc/Threads.htm">当前线程</a>. 指定 <code>Menu, Tray, UseErrorLevel</code> 来阻止显示对话框和终止线程; 作为替代, 如果遇到问题则 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被设置为 1, 否则为 0. 要让此选项转回 off, 请为下一个参数指定 OFF(或在 <span class="ver">[v1.1.30+]</span> 中, 指定 0). 此设置是全局的, 这意味着它影响所有的菜单, 而不只是 <em>MenuName</em>.</p> <h2 id="MenuItemName"><em>MenuItemName</em> 参数</h2> <p>菜单项的名称或位置. 一些通用规则适用于所有使用该参数的子命令:</p> <ul> <li>要为菜单项名称的某个字母加下划线, 在这个字母前加一个 &amp; 符号. 当菜单显示出来时, 此项可以通过按键盘上对应的按键来选中. 要显示原义的 &amp; 符号, 像这个例子一样, 指定连续的两个 &amp; 号: <code>Save &amp;&amp; Exit</code></li> <li>当引用到一个已存在的菜单或菜单项时, 其名称不区分大小写但 & 号不能少. 例如: <code>&amp;Open</code></li> <li><span class="ver">[v1.1.23+]:</span> 要通过在菜单中的位置确定一个菜单项, 写下该菜单项的位置并尾随一个 &amp; 号. 例如, <code>1&amp;</code> 表示第一个菜单项.</li> </ul> <h2 id="Win32_Menus">Win32 菜单</h2> <p>当菜单项被添加到菜单中或被修改时, 每个菜单项的名称和其他属性会被 Menu 命令记录下来, 但实际上 <a href="https://msdn.microsoft.com/en-us/library/ms646977">Win32 菜单</a>并不会被马上创建. 这种情况发生在菜单或父菜单被附加到一个 GUI 或者首次被显示或者菜单在最近一次显示后被 "销毁". 下列任意一种情形都会导致 Win32 菜单被销毁, 其父菜单和子菜单也会随之销毁:</p> <ul> <li>删除菜单.</li> <li>用标签或不同的菜单替换某个菜单项的子菜单.</li> <li><span class="ver">[v1.1.27.03]</span> 之前的版本, 调用子命令 <a href="#NoStandard">NoStandard</a>(如果标准项存在) 或 <a href="#DeleteAll">DeleteAll</a>.</li> </ul> <p>任何通过 Win32 API 调用直接对菜单进行的修改仅适用与菜单的当前 "实例" , 在菜单被销毁后丢失.</p> <p>在首次添加到菜单中时每个菜单项都会被分配到一个 ID. 脚本不能依靠某个菜单项来接收其特定 ID, 但可以像 <a href="MenuGetHandle.htm#Examples">MenuGetHandle 示例</a>中那样使用 GetMenuItemID 获取该 ID. 此 ID 不可以用在 Menu 命令中, 却可以用于多种 <a href="https://msdn.microsoft.com/en-us/library/ms646977">Win32 函数</a>.</p> <h2 id="Remarks">备注</h2> <p>菜单通常看起来像这样:</p> <img src="../static/pics/ctrl_menu.png" alt="Menu" style="border: 1px solid silver;" /> <p>菜单和菜单项的名称长度最多可达 260 个字符.</p> <p>分割线可通过 <code>Menu, <i>MenuName</i>, Add</code> 来增加(也就是忽略其他所有参数). <span class="ver">[v1.1.23+]</span>: 要单独删除分割线, 确定他们在菜单中的位置. 例如, 使用 <code>Menu, <i>MenuName</i>, Delete, 3&amp;</code> 如果分隔符之前有两个项目. 还可以 <code>Menu, <i>MenuName</i>, DeleteAll</code> 然后重新添加自定义菜单项.</p> <p>新的菜单项总是添加到菜单的底部. 对于托盘菜单: 要把您的菜单项放到标准菜单项的上面, (在添加完自定义菜单项后) 执行 <code>Menu, tray, NoStandard</code> 后面接着执行 <code>Menu, tray, Standard</code>.</p> <p>不能使用任何菜单子命令单独操作标准菜单项, 例如 "Pause Script" 和 "Suspend Hotkeys".</p> <p>如果一个菜单项已变得完全空了(例如使用 <code>Menu, MyMenu, DeleteAll</code>), 则无法把它显示出来. 如果托盘菜单变成空的, 则右击和双击托盘菜单将没有效果(此时通常使用 <a href="_NoTrayIcon.htm">#NoTrayIcon</a> 更好).</p> <p>如果一个菜单项的子程序已经运行而用户再次选择相同的菜单项, 则会创建一个新<a href="../misc/Threads.htm">线程</a>运行相同的子程序, 并中断之前的线程. 要缓冲这样的事件到以后执行, 请在子程序的首行使用 <a href="Critical.htm">Critical</a>(不过, 这样也将缓冲/延迟其他线程, 例如按下的热键).</p> <p>每当通过菜单项运行子程序时, 它会使用设置(例如 <a href="SendMode.htm">SendMode</a>) 的默认值开始. 这些默认值可以在<a href="../Scripts.htm#auto">自动执行段</a>改变.</p> <p>内置变量 <strong><a href="../Variables.htm#ThisMenuItem">A_ThisMenuItem</a></strong> 和 <strong><a href="../Variables.htm#ThisMenuItemPos">A_ThisMenuItemPos</a></strong> 分别包含了最近用户选择的自定义菜单项的名称和位置(如果没有则为空). 同样地, <strong>A_ThisMenu</strong> 是选择的 <strong>A_ThisMenuItem</strong> 的菜单名称. 这些变量可用于在创建的菜单内容不总是相同的时候. 在这种情况下, 通常最好把所有这样的菜单项指向相同的标签, 并在此标签中引用上面的变量来决定执行什么动作.</p> <p>要让非热键且非 <a href="Gui.htm">GUI</a> 的脚本持续运行(例如仅包含自定义菜单或菜单项的脚本), 请使用 <a href="_Persistent.htm">#Persistent</a>.</p> <h2 id="Related">相关</h2> <p><a href="Gui.htm">GUI</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Thread.htm">Thread</a>, <a href="Critical.htm">Critical</a>, <a href="_NoTrayIcon.htm">#NoTrayIcon</a>, <a href="Gosub.htm">Gosub</a>, <a href="Return.htm">Return</a>, <a href="SetTimer.htm">SetTimer</a>, <a href="_Persistent.htm">#Persistent</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 添加一个新菜单项到托盘图标菜单的底部.</p> <pre>#Persistent <em>; 让脚本持续运行, 直到用户退出.</em> Menu, Tray, Add <em>; 创建分隔线.</em> Menu, Tray, Add, Item1, MenuHandler <em>; 创建新菜单项.</em> return MenuHandler: MsgBox You selected %A_ThisMenuItem% from menu %A_ThisMenu%. return</pre> </div> <div class="ex" id="ExPopup"> <p><a class="ex_number" href="#ExPopup"></a> 创建一个弹出菜单, 当用户按下热键时显示.</p> <pre><em>; 添加一些菜单项来创建弹出菜单.</em> Menu, MyMenu, Add, Item1, MenuHandler Menu, MyMenu, Add, Item2, MenuHandler Menu, MyMenu, Add <em>; 添加分隔线.</em> <em>; 添加子菜单到上面的菜单中.</em> Menu, Submenu1, Add, Item1, MenuHandler Menu, Submenu1, Add, Item2, MenuHandler <em>; 创建第一个菜单的子菜单(右箭头指示符). 当用户选择它时会显示第二个菜单.</em> Menu, MyMenu, Add, My Submenu, :Submenu1 Menu, MyMenu, Add <em>; 在子菜单下添加分隔线.</em> Menu, MyMenu, Add, Item3, MenuHandler <em>; 在子菜单下添加另一个菜单项.</em> return <em>; 脚本的自动运行段结束.</em> MenuHandler: MsgBox You selected %A_ThisMenuItem% from the menu %A_ThisMenu%. return #z::Menu, MyMenu, Show <em>; 即按下 Win-Z 热键来显示菜单.</em></pre> </div> <div class="ex" id="ExTray"> <p><a class="ex_number" href="#ExTray"></a> 演示了一些菜单子命令.</p> <pre>#Persistent #SingleInstance Menu, Tray, Add <em>; 分隔符</em> Menu, Tray, Add, TestToggle&amp;Check Menu, Tray, Add, TestToggleEnable Menu, Tray, Add, TestDefault Menu, Tray, Add, TestStandard Menu, Tray, Add, TestDelete Menu, Tray, Add, TestDeleteAll Menu, Tray, Add, TestRename Menu, Tray, Add, Test return <em>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</em> TestToggle&amp;Check: Menu, Tray, ToggleCheck, TestToggle&amp;Check Menu, Tray, Enable, TestToggleEnable <em>; 同时启用了下一行的测试, 因为它不能撤销自己的禁用状态.</em> Menu, Tray, Add, TestDelete <em>; 类似于上面.</em> return TestToggleEnable: Menu, Tray, ToggleEnable, TestToggleEnable return TestDefault: if (Default = "TestDefault") { Menu, Tray, NoDefault Default := "" } else { Menu, Tray, Default, TestDefault Default := "TestDefault" } return TestStandard: if (Standard != false) { Menu, Tray, NoStandard Standard := false } else { Menu, Tray, Standard Standard := true } return TestDelete: Menu, Tray, Delete, TestDelete return TestDeleteAll: Menu, Tray, DeleteAll return TestRename: if (NewName != "renamed") { OldName := "TestRename" NewName := "renamed" } else { OldName := "renamed" NewName := "TestRename" } Menu, Tray, Rename, %OldName%, %NewName% return Test: MsgBox, You selected "%A_ThisMenuItem%" in menu "%A_ThisMenu%". return</pre> </div> <div class="ex" id="ExIcon"> <p><a class="ex_number" href="#ExIcon"></a> 演示如何添加图标到其菜单项.</p> <pre>Menu, FileMenu, Add, Script Icon, MenuHandler Menu, FileMenu, Add, Suspend Icon, MenuHandler Menu, FileMenu, Add, Pause Icon, MenuHandler Menu, FileMenu, Icon, Script Icon, %A_AhkPath%, 2 <em>; 使用文件中的第二个图标组</em> Menu, FileMenu, Icon, Suspend Icon, %A_AhkPath%, -206 <em>; 使用资源标识符 206 表示的图标</em> Menu, FileMenu, Icon, Pause Icon, %A_AhkPath%, -207 <em>; 使用资源标识符 207 表示的图标</em> Menu, MyMenuBar, Add, &amp;File, :FileMenu Gui, Menu, MyMenuBar Gui, Add, Button, gExit, Exit This Example Gui, Show return MenuHandler: return Exit: ExitApp </pre> </div> <div class="ex" id="ExBoundFunc"> <p><a class="ex_number" href="#ExBoundFunc"></a> 演示了使用<a href="../objects/Functor.htm#BoundFunc">绑定函数对象</a>传递额外的参数时, 使用函数而不是子程序</p> <pre><em>; 绑定参数到函数并返回绑定函数对象:</em> BoundGivePar := Func("GivePar").Bind("First", "Test one") BoundGivePar2 := Func("GivePar").Bind("Second", "Test two") <em>; 创建菜单并显示:</em> Menu MyMenu, Add, Give parameters, % BoundGivePar Menu MyMenu, Add, Give parameters2, % BoundGivePar2 Menu MyMenu, Show <em>; 定义自定义函数 GivePar:</em> GivePar(a, b, ItemName, ItemPos, MenuName) { MsgBox % "a:`t`t" a "`n" . "b:`t`t" b "`n" . "ItemName:`t" ItemName "`n" . "ItemPos:`t`t" ItemPos "`n" . "MenuName:`t`t" MenuName }</pre> </div> <a href="https://dftg.net">dftg</a><!-- Cloudflare Pages Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "d5a9c4fcb9b6482fa53ce820d892f969"}'></script><!-- Cloudflare Pages Analytics --><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"rayId":"93b0aa796bad2041","version":"2025.4.0-1-g37f21b1","r":1,"serverTiming":{"name":{"cfExtPri":true,"cfL4":true,"cfSpeedBrain":true,"cfCacheStatus":true}},"token":"51750bb5dc4f40cc91a5ec55c63bbc01","b":1}' crossorigin="anonymous"></script> </body> </html>