我认为几乎所有可以通过具有特殊 role
属性的菜单项触发的操作,都应该能够通过编程方式触发。原因是对于像VSCode这样的实现自定义菜单栏和/或命令板的应用,你希望能够在原生菜单中显示所有可以通过使用特殊 role
属性在原生菜单中显示的操作。
以下是当前所有角色的列表,带有表示它们是否可以被编程方式触发的emoji,以及触发它们的可能方法(在我的知识范围内):
- appMenu: 这个角色实际上不会触发操作。
- fileMenu: 这个角色实际上不会触发操作。
- editMenu: 这个角色实际上不会触发操作。
- viewMenu: 这个角色实际上不会触发操作。
- windowMenu: 这个角色实际上不会触发操作。
- help: 这个角色实际上不会触发操作。
- services: 无需为此API提供API。
- window: 这个角色实际上不会触发操作。
- ✅ undo:
document.execCommand ( 'undo' )
. - ✅ redo:
document.execCommand ( 'redo' )
. - ✅ cut:
document.execCommand ( 'cut' )
. - ✅ copy:
document.execCommand ( 'copy' )
. - ✅ paste:
document.execCommand ( 'paste' )
. - ❌ pasteAndMatchStyle
- ✅ delete:
document.execCommand ( 'delete' )
. - ✅ selectAll:
document.execCommand ( 'selectAll' )
. - ✅ reload:
BrowserWindow#webContents#reload
. - ✅ forceReload:
BrowserWindow#webContents#reloadIgnoringCache
. - ✅ minimize:
BrowserWindow#minimize
. - ✅ close:
window.close ()
. - ✅ togglefullscreen:
BrowserWindow#setFullScreen
+BrowserWindow#isFullScreen
. - 一个
BrowserWindow#toggleFullscreen
方法会很好。 - ✅ toggleDevTools:
BrowserWindow#webContents#toggleDevTools
. - ✅ resetZoom:
document.documentElement.style.zoom = 1
. - ✅ zoomIn:
document.documentElement.style.zoom = Number ( document.documentElement.style.zoom || 1 ) + .1
. - ✅ zoomOut:
document.documentElement.style.zoom = Number ( document.documentElement.style.zoom || 1 ) - .1
. - ✅ about:
app.showAboutPanel
- ✅ quit:
app.quit
- ❌ startSpeaking: 也许可以使用applescript来实现这个功能,但这个功能很可能是由Electron本身提供的。
- ❌ stopSpeaking: 也许可以使用applescript来实现这个功能,但这个功能很可能是由Electron本身提供的。
- ❌ zoom: 也许可以使用applescript来实现这个功能,但这个功能很可能是由Electron本身提供的。
- ❌ recentDocuments
- ✅ clearRecentDocuments
app.clearRecentDocuments
- ❌ hide
BrowserWindow#getAllWindows
不返回开发者工具窗口。- 一旦我调用了
BrowserWindow#hide
我就无法再以某种原因显示该窗口了,Dock -> Show All Windows 也无法显示它。 - 一个
BrowserWindow.hideAll
可能很好。 - ❌ hideOthers: 也许可以使用applescript来实现这个功能,但这个功能很可能是由Electron本身提供的。
- ❌ unhide: 也许可以使用applescript来实现这个功能,但这个功能很可能是由Electron本身提供的。
- 这个角色似乎没有一个很好的名称,它似乎是
hide
角色的反义词,但hide
只隐藏了我们的Electron应用,而unhide
则隐藏了一切。 - ❌ front: 也许可以在通过
BrowserWindow#getAllWindows
检索到的所有窗口上调用BrowserWindow#getAllWindows
以实现这一点,但BrowserWindow#mergeAllWindows
并不会返回所有窗口(没有开发者工具,并且没有更改开发者工具窗口可见性的方法)。 - ✅ mergeAllWindows:
BrowserWindow#mergeAllWindows
. - ✅ selectNextTab:
BrowserWindow#selectNextTab
. - ✅ selectPreviousTab:
BrowserWindow#selectPreviousTab
. - ✅ toggleTabBar:
BrowserWindow#toggleTabbar
. - ✅ moveTabToNewWindow:
BrowserWindow#moveTabToNewWindow
2条答案
按热度按时间5w9g7ksd1#
fabiospampinato,你看过
Menu.sendActionToFirstResponder
吗?dhxwm5r42#
@bpasero 不用惊慌,感谢提供的链接!显然这里还有一个原生操作列表,一些角色Map到这些操作。
我保持这个开放是因为:
Menu.sendActionToFirstReponder
触发的操作Menu.sendActionToFirstReponder
API 有更好的文档/更易于访问,我会非常高兴,至少会在这个和这个的文档中链接pasteAndMatchStyle
的操作,我没有找到它unhide
角色的菜单项只有在实际上有任何隐藏应用时才会启用,我认为没有API可以理解这种情况,所以这种逻辑似乎无法完全重新实现