diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart
index 5796c7d20..8df84af6c 100644
--- a/flutter/lib/common/widgets/peer_card.dart
+++ b/flutter/lib/common/widgets/peer_card.dart
@@ -1,3 +1,5 @@
+import 'dart:io';
+
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_hbb/common/widgets/address_book.dart';
@@ -446,6 +448,22 @@ abstract class BasePeerCard extends StatelessWidget {
     );
   }
 
+  /// Only avaliable on Windows.
+  @protected
+  MenuEntryBase<String> _createShortCutAction(String id) {
+    return MenuEntryButton<String>(
+      childBuilder: (TextStyle? style) => Text(
+        translate('Create Desktop Shortcut'),
+        style: style,
+      ),
+      proc: () {
+        bind.mainCreateShortcut(id: id);
+      },
+      padding: menuPadding,
+      dismissOnClicked: true,
+    );
+  }
+
   @protected
   Future<MenuEntryBase<String>> _forceAlwaysRelayAction(String id) async {
     const option = 'force-always-relay';
@@ -649,6 +667,9 @@ class RecentPeerCard extends BasePeerCard {
       menuItems.add(_rdpAction(context, peer.id));
     }
     menuItems.add(_wolAction(peer.id));
+    if (Platform.isWindows) {
+      menuItems.add(_createShortCutAction(peer.id));
+    }
     menuItems.add(MenuEntryDivider());
     menuItems.add(_renameAction(peer.id, false));
     menuItems.add(_removeAction(peer.id, () async {
@@ -681,6 +702,9 @@ class FavoritePeerCard extends BasePeerCard {
       menuItems.add(_rdpAction(context, peer.id));
     }
     menuItems.add(_wolAction(peer.id));
+    if (Platform.isWindows) {
+      menuItems.add(_createShortCutAction(peer.id));
+    }
     menuItems.add(MenuEntryDivider());
     menuItems.add(_renameAction(peer.id, false));
     menuItems.add(_removeAction(peer.id, () async {
@@ -715,6 +739,9 @@ class DiscoveredPeerCard extends BasePeerCard {
       menuItems.add(_rdpAction(context, peer.id));
     }
     menuItems.add(_wolAction(peer.id));
+    if (Platform.isWindows) {
+      menuItems.add(_createShortCutAction(peer.id));
+    }
     menuItems.add(MenuEntryDivider());
     menuItems.add(_removeAction(peer.id, () async {}));
     return menuItems;
@@ -740,6 +767,9 @@ class AddressBookPeerCard extends BasePeerCard {
       menuItems.add(_rdpAction(context, peer.id));
     }
     menuItems.add(_wolAction(peer.id));
+    if (Platform.isWindows) {
+      menuItems.add(_createShortCutAction(peer.id));
+    }
     menuItems.add(MenuEntryDivider());
     menuItems.add(_renameAction(peer.id, false));
     menuItems.add(_removeAction(peer.id, () async {}));
diff --git a/src/core_main.rs b/src/core_main.rs
index d22d4e71b..39b13999e 100644
--- a/src/core_main.rs
+++ b/src/core_main.rs
@@ -1,6 +1,10 @@
 use hbb_common::log;
 
-// shared by flutter and sciter main function
+/// shared by flutter and sciter main function
+/// 
+/// [Note]
+/// If it returns [`None`], then the process will terminate, and flutter gui will not be started.
+/// If it returns [`Some`], then the process will continue, and flutter gui will be started.
 pub fn core_main() -> Option<Vec<String>> {
     // https://docs.rs/flexi_logger/latest/flexi_logger/error_info/index.html#write
     // though async logger more efficient, but it also causes more problems, disable it for now
@@ -223,6 +227,8 @@ fn import_config(path: &str) {
 ///
 /// [Note]
 /// this is for invoke new connection from dbus.
+/// If it returns [`None`], then the process will terminate, and flutter gui will not be started.
+/// If it returns [`Some`], then the process will continue, and flutter gui will be started.
 #[cfg(feature = "flutter")]
 fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<String>> {
     args.position(|element| {
@@ -250,5 +256,5 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<Strin
         }
     }
     #[cfg(not(target_os = "linux"))]
-    return None;
+    return Some(Vec::new());
 }
diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs
index 3c9ce96b9..3a2e3f58e 100644
--- a/src/flutter_ffi.rs
+++ b/src/flutter_ffi.rs
@@ -973,6 +973,11 @@ pub fn main_wol(id: String) {
     crate::lan::send_wol(id)
 }
 
+pub fn main_create_shortcut(_id: String) {
+    #[cfg(windows)]
+    create_shortcut(_id);
+}
+
 pub fn cm_send_chat(conn_id: i32, msg: String) {
     crate::ui_cm_interface::send_chat(conn_id, msg);
 }