diff --git a/src/server/video_service.rs b/src/server/video_service.rs
index fa9fabb52..f688f9bee 100644
--- a/src/server/video_service.rs
+++ b/src/server/video_service.rs
@@ -19,8 +19,6 @@
 // https://slhck.info/video/2017/03/01/rate-control.html
 
 use super::*;
-#[cfg(windows)]
-use crate::ui::win_privacy::win_event_hook;
 use hbb_common::tokio::sync::{
     mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
     Mutex as TokioMutex,
@@ -307,16 +305,13 @@ pub fn test_create_capturer(privacy_mode_id: i32, timeout_millis: u64) -> bool {
 fn check_uac_switch(privacy_mode_id: i32, captuerer_privacy_mode_id: i32) -> ResultType<()> {
     if captuerer_privacy_mode_id != 0 {
         if privacy_mode_id != captuerer_privacy_mode_id {
-            if !win_event_hook::is_process_consent_running()? {
+            if !crate::ui::win_privacy::is_process_consent_running()? {
                 bail!("consent.exe is running");
             }
         }
-        //if win_event_hook::is_desktop_switched() {
-        if win_event_hook::is_process_consent_running()? {
-            //        win_event_hook::reset_desktop_switch();
+        if crate::ui::win_privacy::is_process_consent_running()? {
             bail!("consent.exe is running");
         }
-        //}
     }
     Ok(())
 }
@@ -347,13 +342,14 @@ fn run(sp: GenericService) -> ResultType<()> {
     #[cfg(windows)]
     let mut captuerer_privacy_mode_id = privacy_mode_id;
     #[cfg(windows)]
-    if win_event_hook::is_process_consent_running()? {
+    if crate::ui::win_privacy::is_process_consent_running()? {
         captuerer_privacy_mode_id = 0;
     }
     log::debug!(
         "Try create capturer with captuerer privacy mode id {}",
         captuerer_privacy_mode_id,
     );
+
     if privacy_mode_id != captuerer_privacy_mode_id {
         log::info!("In privacy mode, but show UAC prompt window for now");
     } else {
diff --git a/src/ui/win_privacy.rs b/src/ui/win_privacy.rs
index b0919e2c8..0bbb040ec 100644
--- a/src/ui/win_privacy.rs
+++ b/src/ui/win_privacy.rs
@@ -314,6 +314,13 @@ fn wait_find_privacy_hwnd(msecs: u128) -> ResultType<HWND> {
     }
 }
 
+pub fn is_process_consent_running() -> ResultType<bool> {
+    let output = std::process::Command::new("cmd")
+        .args(&["/C", "tasklist | findstr consent.exe"])
+        .output()?;
+    Ok(output.status.success() && !output.stdout.is_empty())
+}
+
 #[tokio::main(flavor = "current_thread")]
 async fn set_privacy_mode_state(
     conn_id: i32,
@@ -552,95 +559,6 @@ pub(super) mod privacy_hook {
     }
 }
 
-pub mod win_event_hook {
-    use hbb_common::{bail, lazy_static, ResultType};
-    use std::sync::Mutex;
-    use winapi::{
-        shared::{
-            minwindef::DWORD,
-            ntdef::{LONG, NULL},
-            windef::{HWINEVENTHOOK, HWND},
-            winerror::RPC_E_CHANGED_MODE,
-        },
-        um::{
-            combaseapi::{CoInitializeEx, CoUninitialize},
-            objbase::COINIT_MULTITHREADED,
-            winuser::{
-                SetWinEventHook, UnhookWinEvent, EVENT_SYSTEM_DESKTOPSWITCH, WINEVENT_OUTOFCONTEXT,
-                WINEVENT_SKIPOWNPROCESS,
-            },
-        },
-    };
-
-    lazy_static::lazy_static! {
-        static ref DESKTOP_SWITCH: Mutex<bool> = Mutex::new(false);
-    }
-
-    pub fn is_desktop_switched() -> bool {
-        *DESKTOP_SWITCH.lock().unwrap()
-    }
-
-    pub fn reset_desktop_switch() {
-        *DESKTOP_SWITCH.lock().unwrap() = false;
-    }
-
-    pub struct WinEventHook {
-        hook: HWINEVENTHOOK,
-    }
-
-    impl WinEventHook {
-        fn create() -> ResultType<Self> {
-            unsafe {
-                if RPC_E_CHANGED_MODE == CoInitializeEx(NULL, COINIT_MULTITHREADED) {
-                    bail!("Failed CoInitializeEx with RPC_E_CHANGED_MODE");
-                }
-
-                let hook = SetWinEventHook(
-                    EVENT_SYSTEM_DESKTOPSWITCH,
-                    EVENT_SYSTEM_DESKTOPSWITCH,
-                    NULL as _,
-                    Some(hook_win_event),
-                    0,
-                    0,
-                    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS,
-                );
-                Ok(Self { hook })
-            }
-        }
-    }
-
-    impl Drop for WinEventHook {
-        fn drop(&mut self) {
-            unsafe {
-                UnhookWinEvent(self.hook);
-                CoUninitialize();
-            }
-        }
-    }
-
-    #[no_mangle]
-    pub extern "system" fn hook_win_event(
-        _hook: HWINEVENTHOOK,
-        event: DWORD,
-        _hwnd: HWND,
-        _id_object: LONG,
-        _id_child: LONG,
-        _dw_event_thread: DWORD,
-        _dwms_event_time: DWORD,
-    ) {
-        if event == EVENT_SYSTEM_DESKTOPSWITCH {
-            *DESKTOP_SWITCH.lock().unwrap() = true;
-        }
-    }
-
-    pub fn is_process_consent_running() -> ResultType<bool> {
-        let output = std::process::Command::new("cmd")
-            .args(&["/C", "tasklist | findstr consent.exe"])
-            .output()?;
-        Ok(output.status.success() && !output.stdout.is_empty())
-    }
-}
-
 mod test {
     #[test]
     fn privacy_hook() {