虚拟桌面

突然翻到以前的一个小软件,这个软件的作用是创建一个虚拟桌面,并切换到他,这还是在Win7时代时候的了,貌似那时候很多人用这种类似的软件在上班时玩游戏,但是在Win10中加入了虚拟桌面,这类软件不知道怎么样了。

Win10中可以点击任务视图按钮,在最上面就可以创建,(虚拟桌面在Linux操作系统是一个标配,但是在Windows操作系统一直没有此功能,直到Win10才加入这项功能)。


笔记本的话四个手指左右滑动触摸板就可以切换,或者Win + Ctrl + → |←切换。

创建一个虚拟桌面需要CreateDesktop函数,创建出来还需要切换过去,则要使用SwitchDesktop,如果要在虚拟桌面中运行程序,则可以使用CreateProcess,另外创建的新桌面是光秃秃的,并没有桌面图标、桌面壁纸,所以我们要注册一个快捷键,切换过去的时候还要可以切换回来,由于学艺不精,只会点VB,VB注册全局快捷键需要改变默认的窗口过程,然后去判断消息标识是不是WM_HOTKEY,在做相应的判断。

CreateDesktop函数参数

HDESK CreateDesktopA(LPCSTR                lpszDesktop,LPCSTR                lpszDevice,DEVMODEA              *pDevmode,DWORD                 dwFlags,ACCESS_MASK           dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa
);

lpszDesktops:要创建的桌面的名称。桌面名称不区分大小写,并且不能包含反斜杠字符。

lpszDevice:保留;必须为NULL。

pDevmode:保留;必须为NULL。

dwFlags:此参数可以为零或DF_ALLOWOTHERACCOUNTHOOK,DF_ALLOWOTHERACCOUNTHOOK意思是使在桌面上其他帐户中运行的进程能够在此进程中设置挂钩。

dwDesiredAccess:桌面的权限。

lpsa:指向SECURITY_ATTRIBUTES结构的指针,该结构确定返回的句柄是否可以由子进程继承。如果lpsa为NULL,则不能继承该句柄。

实例

这部分是创建新的桌面,并将默认的窗口过程改成myWindowProc。

其中的GetThreadDesktop用来检索分配给指定线程的桌面的句柄,还有RegisterHotKey注册一个快捷键,当快捷键按下时,窗口过程中会收到WM_HOTKEY消息。


Private Sub Form_Load()
g_hDesktopThreadOld = GetThreadDesktop(App.ThreadID)
RegisterHotKey Me.hWnd, 1, MOD_CONTROL, Asc("Q")
RegisterHotKey Me.hWnd, 2, MOD_CONTROL, Asc("W")
g_hDesktopNameNew = "MyNewDesktop"g_hDesktopNew = CreateDesktop(g_hDesktopNameNew, vbNullString, ByVal 0&, 0, GENERIC_ALL, ByVal 0&)
SetThreadDesktop g_hDesktopNew
lpOldWinProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf myWindowProc)
End Sub

模块中。

这部分主要的逻辑就是判断热键,如果是Ctrl+W,则通过SwitchDesktop 切换到新的桌面,另外通过CreateProcess在新的桌面中打开一个资源管理器(CreateProcess参数中的STARTUPINFOA结构体lpDesktop属性指定新的桌面名称即可),如果是Ctrl+Q则切换到原来桌面。

SwitchDesktop只有一个参数,桌面的句柄,这个句柄由CreateDesktop和 OpenDesktop函数返回。

Public Declare Function GetThreadDesktop Lib "user32" (ByVal dwThread As Long) As Long
Public Declare Function CreateDesktop Lib "user32" Alias "CreateDesktopA" (ByVal lpszDesktop As String, ByVal lpszDevice As String, pDevmode As Long, ByVal dwFlags As Long, ByVal dwDesiredAccess As Long, lpsa As Long) As Long
Public Declare Function SwitchDesktop Lib "user32" (ByVal hDesktop As Long) As Long
Public Declare Function SetThreadDesktop Lib "user32" (ByVal hDesktop As Long) As Long
Public Declare Function CloseDesktop Lib "user32" (ByVal hDesktop As Long) As Long
Public Declare Function OpenDesktop Lib "user32" Alias "OpenDesktopA" (ByVal lpszDesktop As String, ByVal dwFlags As Long, ByVal fInherit As Boolean, ByVal dwDesiredAccess As Long) As Long
Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Long, lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32Public Const MOD_CONTROL = &H2
Public Const WM_HOTKEY = &H312
Public Const GWL_WNDPROC = -4Public Type STARTUPINFOcb As LonglpReserved As StringlpDesktop As StringlpTitle As StringdwX As LongdwY As LongdwXSize As LongdwYSize As LongdwXCountChars As LongdwYCountChars As LongdwFillAttribute As LongdwFlags As LongwShowWindow As IntegercbReserved2 As IntegerlpReserved2 As LonghStdInput As LonghStdOutput As LonghStdError As Long
End TypePublic Type PROCESS_INFORMATIONhProcess As LonghThread As LongdwProcessId As LongdwThreadId As Long
End TypePublic Type DEVMODEdmDeviceName As String * CCHDEVICENAMEdmSpecVersion As IntegerdmDriverVersion As IntegerdmSize As IntegerdmDriverExtra As IntegerdmFields As LongdmOrientation As IntegerdmPaperSize As IntegerdmPaperLength As IntegerdmPaperWidth As IntegerdmScale As IntegerdmCopies As IntegerdmDefaultSource As IntegerdmPrintQuality As IntegerdmColor As IntegerdmDuplex As IntegerdmYResolution As IntegerdmTTOption As IntegerdmCollate As IntegerdmFormName As String * CCHFORMNAMEdmUnusedPadding As IntegerdmBitsPerPel As LongdmPelsWidth As LongdmPelsHeight As LongdmDisplayFlags As LongdmDisplayFrequency As Long
End TypePublic Type SECURITY_ATTRIBUTESnLength As LonglpSecurityDescriptor As LongbInheritHandle As Long
End TypePublic Const GENERIC_ALL = &H10000000Public Const DESKTOP_SWITCHDESKTOP = &H100
Public Const DESKTOP_CREATEMENU = &H4&
Public Const DESKTOP_CREATEWINDOW = &H2&
Public Const DESKTOP_ENUMERATE = &H40&
Public Const DESKTOP_HOOKCONTROL = &H8&
Public Const DESKTOP_JOURNALPLAYBACK = &H20&
Public Const DESKTOP_JOURNALRECORD = &H10&
Public Const DESKTOP_READOBJECTS = &H1&
Public Const DESKTOP_WRITEOBJECTS = &H80&
Public Const DESKTOP_ALL = 511
Public Const MAXIMUM_ALLOWED = &H2000000Public lpOldWinProc As Long
Public g_hDesktopThreadOld As Long
Public g_hDesktopNew As Long, g_hDesktopNameNew As StringFunction myWindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_HOTKEY ThenIf wParam = 2 And g_hDesktopNew <> 0 ThenSwitchDesktop g_hDesktopNewstartExplorer ("explorer.exe")End IfIf wParam = 1 ThenSwitchDesktop g_hDesktopThreadOldEnd If
End If
myWindowProc = CallWindowProc(lpOldWinProc, hWnd, uMsg, wParam, lParam)
End FunctionPublic Sub startExplorer(str As String)
Dim sui As STARTUPINFO, pi As PROCESS_INFORMATION
sui.cb = Len(sui)
sui.lpDesktop = g_hDesktopNameNew
CreateProcess vbNullString, str, ByVal 0&, ByVal 0&, 1, &H4000000 Or &H800, ByVal 0&, vbNullString, sui, pi
End Sub

是不是有点意思呢?

Windows编程之虚拟桌面实现原理相关推荐

  1. 怎样取消Windows 10的虚拟桌面切换动画和窗口动画

    怎样取消Windows 10的虚拟桌面切换动画和窗口动画 对于晕3D的人来说这是真的要命. 步骤: 在"这台电脑"上点击右键(如bai何在Win10桌面上显示"du这台电 ...

  2. windows虚拟桌面_在Windows中使用虚拟桌面的最佳免费程序

    windows虚拟桌面 If you often open a lot of applications at once, a virtual desktop program can help you ...

  3. Windows 10的虚拟桌面

    Windows 10的虚拟桌面 简介 使用虚拟桌面的快捷键 IVirtualDesktopManager接口 Windows Desktop API 总结 注脚 简介 Windows 10发布后,Wi ...

  4. NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面

    NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面. NICE DCV: 满足 LINUX 和 WINDOWS 的远程 3D 通过 NICE ...

  5. 【windows编程之对话框】对话框原理,对话框的创建

    文章目录 引言 一.对话框原理 1.对话框的分类 2.对话框的基本使用 2.自定义对话框窗口消息处理函数 二.模式对话框 - 1.创建对话框 - 2.对话框的关闭 - 3.对话框消息 三.模式对话框创 ...

  6. 虚拟桌面最佳组合---Windows 7

    从去年开始虚拟桌面开始在国内遍地开花时,其实,用户一直在观望,像是观望楼市一样观望,都在等最好虚拟桌面产品(XenDesktop\View\Microsoft VDI),以及最优的虚拟桌面组合.其实, ...

  7. 开发者神器!Windows上最强大的虚拟桌面工具-Dexpot

    简介 : 用过Linux和Mac计算机的人都知道 , 这两个系统上都有个多桌面的功能非常使用 . 而在Windows上并没有该项功能 , 虽然目前Win10已经增加了多桌面的程序 , 但使用上仍体验不 ...

  8. [AHK]如何更改键盘快捷方式,在 Windows 10 中的虚拟桌面之间切换

    搜集了新的解决方案,请猛戳 https://blog.csdn.net/liuyukuan/article/details/102731088 ; Capslock + 数字  -->  切换虚 ...

  9. linux虚拟桌面设置不同的背景,虚拟桌面增强器为Windows 10中的每个虚拟桌面设置不同的壁纸 | MOS86...

    虚拟桌面对于Linux用户来说并不是什么新鲜事物,尽管他们通过稍微不同的名称知道它们 - 工作区.鉴于此功能对多任务用户的重要性,Microsoft于去年在Windows 10中引入了虚拟桌面的功能. ...

  10. windows虚拟桌面_如何在Windows 10中使用虚拟桌面

    windows虚拟桌面 Windows 10 finally added virtual desktops as a built-in feature. If you keep a lot of ap ...

最新文章

  1. HTML5跳转页面并传值以及localStorage的用法
  2. [转]SupSite页面文件与模块关系说明
  3. idea打包springboot项目为war包并运行
  4. C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑
  5. 蓝桥杯历届试题----分糖果(模拟)
  6. JavaScript学习(二十七)—解决IE以及IE8之前的浏览器下面的添加事件或者删除事件
  7. html css字幕滚动代码,纯CSS实现滚动3D字幕
  8. python实现网站测速软件_python实现网站友情链接查询与网站死链接查询的两个脚步...
  9. 16.卷2(进程间通信)---Sun RPC
  10. iqc工作职责和工作内容_新媒体实习生是做什么的?新媒体实习生岗位职责工作内容...
  11. 记录一次es商品模糊查询
  12. 疫情核酸检测,应考虑使用刷身份证的方式
  13. 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
  14. 小颖java源代码反编译_小颖JAVA源代码反编译工具下载|
  15. 按120分计算成绩 mysql_mySql数据库基础
  16. 计算机外部设备培训教学计划,【精品】计算机教学计划4篇
  17. 003. 电话号码的字母组合——回溯算法
  18. Angular 4入门教程系列:9:TypeScript:ECMAScript之前世今生
  19. C++ std::accumulate
  20. poj 1789 kruscal水题

热门文章

  1. 2022-2028全球阿兹夫定片行业市场现状及未来发展趋势
  2. Route-Policy
  3. docker-bridge如何通信
  4. 我的所有知识都来自大富翁游戏
  5. 社科院与杜兰大学金融管理硕士项目——在职读研是吸引力效应吗?
  6. php服务器支付宝的pcm,php - 支付宝当面付报错
  7. 运动蓝牙耳机挑选要注意什么?蓝牙耳机知识科普
  8. 用c++从头开始实现决策树
  9. 如何写一篇数据分析报告3 - 分析背景是什么
  10. uhd驱动安装(usrpB210,usrpX310等)