diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs
index 0398735e227b08fdd7d405f7fb7578a184e4e674..dd48b56b05e049386684d46d9e1424159e3cb1bd 100644
--- a/src-tauri/src/core/tray.rs
+++ b/src-tauri/src/core/tray.rs
@@ -141,7 +141,7 @@ impl Tray {
                 "restart_clash" => feat::restart_clash_core(),
                 "restart_app" => api::process::restart(&app_handle.env()),
                 "quit" => {
-                    let _ = resolve::save_window_size_position(app_handle);
+                    let _ = resolve::save_window_size_position(app_handle, true);
 
                     resolve::resolve_reset();
                     api::process::kill_children();
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index a5d2efa5eb3c61fa11b443c66af442015d52f42d..59903db9ce597b47d3c5c50ba8164a53dc658f1e 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -109,7 +109,7 @@ fn main() -> std::io::Result<()> {
                 match event {
                     tauri::WindowEvent::CloseRequested { api, .. } => {
                         api.prevent_close();
-                        let _ = resolve::save_window_size_position(&app_handle);
+                        let _ = resolve::save_window_size_position(&app_handle, true);
 
                         app_handle.get_window("main").map(|win| {
                             let _ = win.hide();
@@ -121,12 +121,13 @@ fn main() -> std::io::Result<()> {
         }
         #[cfg(not(target_os = "macos"))]
         tauri::RunEvent::WindowEvent { label, event, .. } => {
-            use tauri::Manager;
-
             if label == "main" {
                 match event {
                     tauri::WindowEvent::CloseRequested { .. } => {
-                        let _ = resolve::save_window_size_position(&app_handle);
+                        let _ = resolve::save_window_size_position(&app_handle, true);
+                    }
+                    tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => {
+                        let _ = resolve::save_window_size_position(&app_handle, false);
                     }
                     _ => {}
                 }
diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs
index d7ac2459468f1775d5d979dd2a8fded3263a2a7d..8d80ece2290067ad8e3b8860b918e3c0d30c719d 100644
--- a/src-tauri/src/utils/resolve.rs
+++ b/src-tauri/src/utils/resolve.rs
@@ -127,7 +127,7 @@ pub fn create_window(app_handle: &AppHandle) {
 }
 
 /// save window size and position
-pub fn save_window_size_position(app_handle: &AppHandle) -> Result<()> {
+pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> Result<()> {
     let win = app_handle
         .get_window("main")
         .ok_or(anyhow::anyhow!("failed to get window"))?;
@@ -141,7 +141,10 @@ pub fn save_window_size_position(app_handle: &AppHandle) -> Result<()> {
     let verge = Config::verge();
     let mut verge = verge.latest();
     verge.window_size_position = Some(vec![size.width, size.height, pos.x, pos.y]);
-    verge.save_file()?;
+
+    if save_to_file {
+        verge.save_file()?;
+    }
 
     Ok(())
 }