vmware在全屏模式下快速切换回win桌面的方法

news2024/11/14 1:54:30

window上开发没有ubuntu下的方便,经常在window主机和ubuntu虚拟机直接切换太麻烦,每次得ctrl+alt从虚拟机释放鼠标才可以切换,经过折腾发现以下几种方法可行

方法1 虚拟机监听切换按键并通知主机进行切换桌面

虚拟主机放在单独的一个桌面上并全屏,在ubuntu虚拟机中配置一个Py脚本,把监听的按键写入主机中(tcp方式更麻烦,这里采用写入文件传递的方法)

import os
from pynput import keyboard
import time

# 定义组合键,例如 Ctrl + Alt + A、Ctrl + Alt + S、Ctrl + Alt + Z
COMBINATIONS = {
    frozenset([keyboard.Key.ctrl, keyboard.Key.alt, keyboard.KeyCode(char='a')]): "SWITCH_DESKTOP_A",
    frozenset([keyboard.Key.ctrl, keyboard.Key.alt, keyboard.KeyCode(char='s')]): "SWITCH_DESKTOP_S",
    frozenset([keyboard.Key.ctrl, keyboard.Key.alt, keyboard.KeyCode(char='z')]): "SWITCH_DESKTOP_Z"
}
current_keys = set()
triggered = False  # 防止重复触发


def on_press(key):
    global triggered
    current_keys.add(key)
    for combination, command in COMBINATIONS.items():
        if combination.issubset(current_keys) and not triggered:
            # 根据按键组合写入不同的内容到共享文件
            with open("/home/vm/Desktop-win11/switch_command.txt", "w") as f:
                f.write(command)
            triggered = True  # 设置标志位,防止重复触发
            break


def on_release(key):
    global triggered
    if key in current_keys:
        current_keys.remove(key)
    # 如果所有按键都释放,重置标志位
    if not current_keys:
        triggered = False


with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

在主机上使用autohotkeys进行多桌面切换

VDA_PATH := "./VirtualDesktopAccessor.dll"
hVirtualDesktopAccessor := DllCall("LoadLibrary", "Str", VDA_PATH, "Ptr")

GoToDesktopNumberProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "GoToDesktopNumber", "Ptr")

GoToDesktopNumber(num) {
    global GoToDesktopNumberProc
    Send, ^{Alt}
    DllCall(GoToDesktopNumberProc, "Int", num)
}

; vmware 切换回win
; 定义共享文件路径
sharedFilePath := "C:\Users\marswen\Desktop\switch_command.txt"
lastModified := ""  ; 用于存储上次检测到的文件修改时间
SetTimer, CheckSwitchFile, 100

CheckSwitchFile:
    if FileExist(sharedFilePath) {
        ; 获取当前文件的最后修改时间
        FileGetTime, currentModified, %sharedFilePath%, M

        if (lastModified=""){
            lastModified := currentModified  ; 第一次读取文件内容,记录修改时间
        }
        else if(currentModified != lastModified) {
            ; 如果文件的修改时间不同于上次记录的时间,则读取文件内容并执行操作
            lastModified := currentModified  ; 更新记录的修改时间

            ; 读取文件内容
            FileRead, content, %sharedFilePath%

            ; 根据内容执行不同的操作
            if (content = "SWITCH_DESKTOP_A") {
                GoToDesktopNumber(0)  ; 切换到桌面 1
            } else if (content = "SWITCH_DESKTOP_S") {
                GoToDesktopNumber(1)  ; 切换到桌面 2
            } else if (content = "SWITCH_DESKTOP_Z") {
                GoToDesktopNumber(2)  ; 切换到桌面 3
            }
        }
    }
return

; 使用快捷键 Ctrl + Alt + 字母
^!A::GoToDesktopNumber(0)  ; 切换到第 1 个桌面
^!S::GoToDesktopNumber(1)  ; 切换到第 2 个桌面
^!Z::GoToDesktopNumber(2)  ; 切换到第 3 个桌面


; #:WIN  ^:Ctrl !:Alt  +:Shift  
; 映射window终端中键为 Ctrl + Shift + V
#IfWinActive ahk_exe WindowsTerminal.exe ; 针对 Windows Terminal
MButton::Send ^+v ; 将中键设置为 Ctrl + Shift + V
#IfWinActive

; 映射window终端中键为 WIN+V
; ctrl+alt+G -> WIN+V
^!G::Send #v ; 将 ctrl+alt+G 映射为 WIN+V

把这两个文件设置分别开机启动即可

方法2 通过vmware-kvm.exe配置参数,window主机和vmware共用一个桌面

进入C:\Program Files (x86)\VMware\VMware Workstation,该目录下有vmware-kvm.exe,在该目录下配置vmware-kvm.exe的切换回window的快捷键

 vmware-kvm.exe --preferences

这里我设置的ctrl+alt+x
在这里插入图片描述
把vmware-kvm.exe快捷方式发送到桌面,找到你对应的虚拟机.vmx文件,复制其路径到快捷方式的参数中
例如

"C:\Program Files (x86)\VMware\VMware Workstation\vmware-kvm.exe" "D:\win\Ubuntu20\Ubuntu20.vmx"

在这里插入图片描述
双击这个快捷方式启动虚拟机,使用快捷键就可以方便在win和vm之间切换

方法三 使用hook获取系统底层输入

请参考WinDeskSwitch,真正可以随心所欲切换

#include Lib\AutoHotInterception.ahk

VDA_PATH := "./Lib/VirtualDesktopAccessor.dll"
hVirtualDesktopAccessor := DllCall("LoadLibrary", "Str", VDA_PATH, "Ptr")
GoToDesktopNumberProc := DllCall("GetProcAddress", "Ptr", hVirtualDesktopAccessor, "AStr", "GoToDesktopNumber", "Ptr")
GoToDesktopNumber(num) {
    global GoToDesktopNumberProc
    DllCall(GoToDesktopNumberProc, "Int", num)
}

AHI := new AutoHotInterception()
keyboardId := 1  
AHI.SubscribeKey(keyboardId, GetKeySC("Control"), false, Func("KeyEvent").Bind("ctrl"))
AHI.SubscribeKey(keyboardId, GetKeySC("Alt"), false, Func("KeyEvent").Bind("alt"))
AHI.SubscribeKey(keyboardId, GetKeySC("a"), false, Func("KeyEvent").Bind("a"))
AHI.SubscribeKey(keyboardId, GetKeySC("s"), false, Func("KeyEvent").Bind("s"))
AHI.SubscribeKey(keyboardId, GetKeySC("z"), false, Func("KeyEvent").Bind("z"))

ctrl_state :=  "Released"
alt_state :=  "Released"
a_state :=  "Released"
s_state :=  "Released"
z_state :=  "Released"

KeyEvent(keyName, state) {
    global ctrl_state, alt_state, a_state, s_state, z_state, hLvKeyboard
    Gui, ListView, % hLvKeyboard
    stateText := (state = 1) ? "Pressed" : "Released"

    if (keyName = "ctrl") {
        ctrl_state := stateText
    } else if (keyName = "alt") {
        alt_state := stateText
    } else if (keyName = "a") {
        a_state := stateText
    } else if (keyName = "s") {
        s_state := stateText
    } else if (keyName = "z") {
        z_state := stateText
    }
    
    ; ToolTip, %ctrl_state%   %alt_state%  %a_state%   %s_state%   %z_state%
    if (ctrl_state= "Pressed" && alt_state== "Pressed" ) {
        if(a_state== "Pressed" ){
            GoToDesktopNumber(0)  ; 切换到桌面 1
        }
        else if(s_state== "Pressed" ){
            GoToDesktopNumber(1)  ; 切换到桌面 2
        }
        else if(z_state== "Pressed" ){
            GoToDesktopNumber(2)  ; 切换到桌面 3
        }
    }
}       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一:Mysql 容器化安装 二:Redis 容器化安装 Redis 简介 Redis 容器创建 三:C容器制作 四:容器资源更新 常见问题 一:Mysql 容器化安装 进入 mysql 的镜像网站,查找 mysql 的镜像 mysql docker…

泷羽sec学习打卡-Linux基础

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base 一、Linux-Base什么时openssl?有哪些加密参数?常用lin…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类,内容如下: Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

odoo17 owl 前端 顶部导航栏右侧添加自定义按钮

odoo17 前端 顶部导航栏右侧添加自定义按钮 先看图 很多时候都想要在这添加个自定义按钮或图标, 无穷下手添加 这里将展示如何在顶部header添加自定义 添加自定义模块 demo 目录结构如下 └─demo│ __init__.py│ __manifest__.py│├─static│ └─src│ ├─s…

Power bi中的lookupvalue函数

lookupvalue函数是一个非常实用的函数,它可用于在两个表之间查找相应的值。kagkupMalue函数可以将一个表中的列值作为参数传递给另一个表中的列,并返回在第二个表中与该值匹配的另一个列的值。在实践中,lookupvalue函数通常用于两个表之间的关…

golang分布式缓存项目 Day5 分布式节点

该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习 1 流程回顾注: 我们在GeeCache 第二天 中描述了 geecache 的流程。在这之前已经实现了流程 ⑴ 和 ⑶&#xf…

[产品管理-76]:延续是创新与颠覆式创新的比较

目录 一、概述 1、定义与特征 2、市场影响与竞争策略 3、实施难度与风险 4、案例分析 二、示例 1. 延续性创新示例 2. 创新示例 3. 颠覆式创新示例 一、概述 延续性创新与颠覆式创新是技术创新领域的两种重要策略,它们在多个方面存在显著差异。 以下是对…

【 AI写作鹅-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

AI:重塑电商行业的创新引擎,开启电商数字化转型新征程

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

语义分割数据增强,图像和标签同步对应详细增强教程(附代码)

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《图像增强》 &a…

pgsql和mysql的自增主键差异

1. 当有历史数据存在时, mysql的自增主键是默认从最大值自增。 pgsql的自增主键取初始值开始逐个尝试,所以存在可能与历史数据的主键重复的情况。 pgsql解决上述问题的方式:重设自增值。 SELECT SETVAL(t_db_filed_id_seq, (SELECT MAX(&q…

Spring Cloud Contract快速入门Demo

1.什么是Spring Cloud Contract ? Spring Cloud Contract 是 Spring 提供的一套工具,用于帮助开发者通过契约(Contract)驱动的方式进行微服务的测试和集成。它主要解决微服务之间通信时,如何确保服务提供者和消费者之…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类,已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC,以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系; 平时在dev环境开发时,会把自己的本地服务也注册上去,但是这样的话,在客户端调用时请求可能会打到自己本地,对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

Go/Golang语言各种数据类型内存字节占用大小和最小值最大值

具体请前往:Go/golang语言基本数据类型字节大小和取值范围(最小值~最大值)

力扣104 : 二叉树最大深度

补:二叉树的最大深度 描述: 给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解? 树一般常用递归:递到叶子节点开始倒着处理

Android GPU纹理数据拷贝

在 Android 开发中读取纹理数据有以下几种方法: glReadPixelsImageReaderPBO(Pixel BufferObject) HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API,通常用于从帧缓冲区中读取像素数据,OpenGL ES…

畅捷通T+ RecoverPassword.aspx

用友 畅捷通T RecoverPassword.aspx 存在未授权管理员密码修改漏洞,攻击者可以通过漏洞修改管理员账号密码登录后台 #漏洞影响版本 12.0,12.1.12.2.12.3 13.0 15.0 16.0 18.0 补丁号291都影响 19.0 补丁号167之前也有影响 对于老版本畅捷通已经…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

python数据写入excel文件

主要思路:数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e , v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法,指定了 orient‘index’ 表示使用字典的键作为行索引,然…