{"id":13785087,"url":"https://github.com/leanflutter/shortcut_menu_extender","last_synced_at":"2025-08-23T20:11:58.759Z","repository":{"id":212659640,"uuid":"732014325","full_name":"leanflutter/shortcut_menu_extender","owner":"leanflutter","description":"This plugin allows Flutter apps to Extending global shortcut menus.","archived":false,"fork":false,"pushed_at":"2025-04-15T14:50:13.000Z","size":94,"stargazers_count":14,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-15T15:37:13.599Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leanflutter.png","metadata":{"files":{"readme":"README-ZH.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"liberapay":"lijy91"}},"created_at":"2023-12-15T12:28:21.000Z","updated_at":"2025-04-15T14:35:15.000Z","dependencies_parsed_at":"2025-04-15T15:28:48.315Z","dependency_job_id":"2d68518d-f2eb-4866-9d1a-0d5a8d970f32","html_url":"https://github.com/leanflutter/shortcut_menu_extender","commit_stats":null,"previous_names":["leanflutter/-shortcut_menu","leanflutter/shortcut_menu_extender"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leanflutter%2Fshortcut_menu_extender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leanflutter%2Fshortcut_menu_extender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leanflutter%2Fshortcut_menu_extender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leanflutter%2Fshortcut_menu_extender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leanflutter","download_url":"https://codeload.github.com/leanflutter/shortcut_menu_extender/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252889212,"owners_count":21820134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T19:00:56.810Z","updated_at":"2025-05-07T13:42:22.860Z","avatar_url":"https://github.com/leanflutter.png","language":"C++","readme":"\u003e **🚀 快速发布您的应用**: 试试 [Fastforge](https://fastforge.dev) - 构建、打包和分发您的 Flutter 应用最简单的方式。\n\n# shortcut_menu_extender\n\n[![pub version][pub-image]][pub-url] [![][discord-image]][discord-url] ![][visits-count-image]\n\n[pub-image]: https://img.shields.io/pub/v/shortcut_menu_extender.svg\n[pub-url]: https://pub.dev/packages/shortcut_menu_extender\n[discord-image]: https://img.shields.io/discord/884679008049037342.svg\n[discord-url]: https://discord.gg/zPa6EZ2jqb\n[visits-count-image]: https://img.shields.io/badge/dynamic/json?label=Visits%20Count\u0026query=value\u0026url=https://api.countapi.xyz/hit/leanflutter.shortcut_menu_extender/visits\n\n这个插件允许 Flutter 应用扩展全局快捷菜单。\n\n---\n\n[English](./README.md) | 简体中文\n\n---\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [shortcut_menu_extender](#shortcut_menu_extender)\n  - [平台支持](#平台支持)\n  - [快速开始](#快速开始)\n    - [安装](#安装)\n    - [用法](#用法)\n      - [Windows](#windows)\n    - [注册/取消注册](#注册取消注册)\n    - [监听事件](#监听事件)\n  - [谁在用使用它？](#谁在用使用它)\n  - [赞助者](#赞助者)\n  - [许可证](#许可证)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## 平台支持\n\n| Linux | macOS | Windows |\n| :---: | :---: | :-----: |\n|  ➖   |  ➖   |   ✔️    |\n\n## 快速开始\n\n### 安装\n\n将此添加到你的软件包的 pubspec.yaml 文件：\n\n```yaml\ndependencies:\n  shortcut_menu_extender: ^0.1.1\n```\n\n### 用法\n\n##### Windows\n\n更改文件 `windows/runner/main.cpp` 如下：\n\n```diff\n#include \u003cflutter/dart_project.h\u003e\n#include \u003cflutter/flutter_view_controller.h\u003e\n#include \u003cwindows.h\u003e\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\n+#include \u003cshortcut_menu_extender_windows/shortcut_menu_extender_windows_plugin_c_api.h\u003e\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance,\n                      _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t* command_line,\n                      _In_ int show_command) {\n+  HANDLE instance_mutex =\n+      CreateMutex(NULL, TRUE, L\"shortcut_menu_extender_example\");\n+  if (GetLastError() == ERROR_ALREADY_EXISTS \u0026\u0026\n+      !ShouldHandleByShortcutMenuExtenderCommand()) {\n+    HWND hwnd = ::FindWindow(L\"FLUTTER_RUNNER_WIN32_WINDOW\",\n+                             L\"shortcut_menu_extender_example\");\n+    if (hwnd != NULL \u0026\u0026 ShouldHandleByShortcutMenuExtender()) {\n+      DispatchToShortcutMenuExtender(hwnd);\n+    }\n+    CloseHandle(instance_mutex);\n+    return EXIT_SUCCESS;\n+  }\n\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) \u0026\u0026 ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector\u003cstd::string\u003e command_line_arguments = GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.Create(L\"shortcut_menu_extender_example\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(\u0026msg, nullptr, 0, 0)) {\n    ::TranslateMessage(\u0026msg);\n    ::DispatchMessage(\u0026msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n```\n\n```dart\nimport 'package:shortcut_menu_extender/shortcut_menu_extender.dart';\n\nvoid main() async {\n  // 必须加上这一行。\n  WidgetsFlutterBinding.ensureInitialized();\n\n  if (shortcutMenuExtenderCommand.runIfNeeded(args)) exit(0);\n\n  runApp(MyApp());\n}\n```\n\n### 注册/取消注册\n\n```dart\nshortcutMenuExtender.register(\n  'MyFlutterApp',\n  name: 'Open With MyFlutterApp',\n  executable: Platform.resolvedExecutable,\n  useDefaultIcon: true,\n);\n\nshortcutMenuExtender.unregister(\n  'MyFlutterApp',\n);\n```\n\n### 监听事件\n\n```dart\nclass HomePage extends StatefulWidget {\n  const HomePage({Key? key}) : super(key: key);\n\n  @override\n  _HomePageState createState() =\u003e _HomePageState();\n}\n\nclass _HomePageState extends State\u003cHomePage\u003e with ShortcutMenuListener {\n  @override\n  void initState() {\n    shortcutMenuExtender.addListener(this);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    shortcutMenuExtender.removeListener(this);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // ...\n  }\n\n  @override\n  void onShortcutMenuClicked(String key, String path) {\n    print('onShortcutMenuClicked: $key, $path');\n  }\n}\n```\n\n\u003e 请看这个插件的示例应用，以了解完整的例子。\n\n## 赞助者\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/cmlanche\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/5886757?v=4?s=100\" width=\"100px;\" alt=\"cmlanche\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecmlanche\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## 许可证\n\n[MIT](./LICENSE)\n","funding_links":["https://liberapay.com/lijy91"],"categories":["Packages"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleanflutter%2Fshortcut_menu_extender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleanflutter%2Fshortcut_menu_extender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleanflutter%2Fshortcut_menu_extender/lists"}