Windows多桌面切换(CreateDesktop,SwitchDesktop函数)
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Buttons, ExtCtrls,
TrayIconForm, AppEvnts; type
TShareInfo = record
Actived : array [ .. ] of boolean;
end;
PShareInfo = ^TShareInfo; TForm1 = class(TForm)
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N11: TMenuItem;
N21: TMenuItem;
N31: TMenuItem;
N41: TMenuItem;
BitBtn2: TBitBtn;
Panel1: TPanel;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Label4: TLabel;
N4: TMenuItem;
PopupMenu1: TPopupMenu;
ApplicationEvents1: TApplicationEvents;
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Minimize(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
private
{ Private declarations }
RunningOnDesktop: integer;
Failed : boolean;
procedure OnHotKey(var Msg: TMessage); message WM_HOTKEY;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm}
{$R UAC.res} procedure SwitchToDesktop(number: integer);
var name: string;
DsktpHandle: HDESK;
SysPath: array[..MAX_PATH] of char;
PPath: PChar;
StrPath: string;
len: integer;
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
begin
if number = then
name := 'Default'
else
name := 'NewDesktop' + inttostr(number); ZeroMemory(@si, sizeof(STARTUPINFO));
si.cb := sizeof(STARTUPINFO);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow := SW_SHOW;
si.lpDesktop := PChar(Name); DsktpHandle := OpenDesktop(pchar(Name),
DF_ALLOWOTHERACCOUNTHOOK, true,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_JOURNALPLAYBACK or
DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS);
if DsktpHandle = then
begin
// 桌面不存在,创建桌面
DsktpHandle := CreateDesktop(PChar(Name), nil, nil,
DF_ALLOWOTHERACCOUNTHOOK,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_JOURNALPLAYBACK or
DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS,
nil);
if DsktpHandle = then
begin
ShowMessage('打开桌面失败! ' + SysErrorMessage(GetLastError));
exit;
end; PPath := @SysPath;
len := GetWindowsDirectory(@SysPath, MAX_PATH);
SetString(StrPath, PPath, len);
if (not CreateProcess(PChar(StrPath + '/explorer.exe'), nil, nil, nil, True, , nil, nil, si, pi)) then
begin
ShowMessage('进程创建失败! ' + SysErrorMessage(GetLastError));
CloseDeskTop(DsktpHandle);
exit;
end; end; SwitchDesktop(DsktpHandle);
end; procedure TForm1.N3Click(Sender: TObject);
begin
Close;
end; procedure TForm1.N11Click(Sender: TObject);
begin
if Sender is TMenuItem then
SwitchToDesktop((Sender as TMenuItem).Tag);
end; procedure TForm1.N2Click(Sender: TObject);
begin
Show;
end; procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Hide;
end; procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Hide;
end; procedure TForm1.N4Click(Sender: TObject);
begin
TrayForm.Show;
end; procedure TForm1.OnHotKey(var Msg: TMessage);
begin
if Msg.WParam > then
if Msg.WParam <= then
SwitchToDesktop(Msg.WParam); //if Msg.WParam=5 then
// TrayIcon1.Visible := not TrayIcon1.Visible;
end; procedure TForm1.TrayIcon1DblClick(Sender: TObject);
begin
Show;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, , MOD_CONTROL, VK_F1);
RegisterHotKey(Handle, , MOD_CONTROL, VK_F2);
RegisterHotKey(Handle, , MOD_CONTROL, VK_F3);
RegisterHotKey(Handle, , MOD_CONTROL, VK_F4);
RegisterHotKey(Handle, , MOD_CONTROL, VK_F5);
end; end.
参考:http://www.cnblogs.com/key-ok/p/3417735.html
Windows多桌面切换(CreateDesktop,SwitchDesktop函数)的更多相关文章
- [No0000C7]windows 10桌面切换快捷键,win10
windows 10桌面切换快捷键:Ctrl+Win+←/→ 切换窗口:Alt+Tab(不是新的,但任务切换界面改进)任务视图:Win+Tab(松开键盘界面不会消失)创建新的虚拟桌面:Win+Ctrl ...
- Windows 10 虚拟桌面切换
从Windows 10开始,终于有了和Mac一样的虚拟桌面了.但总感觉用着非常的别扭.在Mac中,切换虚拟桌面的操作可谓方便至极:除了触控板和Magic Mouse原生的支持外,通过罗技M557/55 ...
- Windows虚拟桌面
PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; HDESK hDesktop; HDESK hOriginalThread; HDE ...
- windows之桌面程序引导功能
经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过 ...
- Windows远程桌面,连接被拒绝,因为没有授权此用户帐户进行远程登录。
Windows 服务器远程连接的时候,出现错误:“连接被拒绝,因为没有授权此用户帐户进行远程登录.”,导致无法远程登录服务器,如下图所示: 问题分析 该错误一般是由于 Windows 远程桌面相关权限 ...
- linux下使用FreeRDP 连接 Windows 远程桌面
linux下使用FreeRDP 连接 Windows 远程桌面 简介 FreeRDP 是一款开源的远程桌面系统,支持多种平台, 在 ubuntu 中使用 FreeRDP 可以很方便的登录到 win ...
- Windows 7桌面显示图标窗口句柄的获取
在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Progr ...
- Linux下通过rdesktop连接Windows远程桌面
rdesktop是linux下支持Windows远程桌面连接的客户端程序,在linux系统下可通过它远程访问Windows桌面,支持多种版本.rdesktop是sourceforge下支持GPL协议的 ...
- 基于Tcp穿越的Windows远程桌面(远程桌面管理工具)
基于Tcp穿越的Windows远程桌面(远程桌面管理工具) 1.<C# WinForm 跨线程访问控件(实用简洁写法)> 2.<基于.NET环境,C#语言 实现 ...
随机推荐
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- windows 进程间通讯方法
Windows平台为我们提供了多种进程间通信的机制,主要包括:注册表方式.共享文件方式.共享内存方式.共享数据段.映射文件方式.管道方式. 剪贴板方式.消息方式.其中注册表方式需要增加注册表表项,而注 ...
- 关于自己的ES6使用姿势
ES6今年开始学的,从看文档到实践,以下是自己使用过的一些ES6的东西: 1:for-of 语法: 最喜欢的还是它支持了break/continue的语法,而且还修改了for-in的缺陷,简要写法: ...
- (转)Asp.net的HttpCookie写入汉字读取时为乱...
今天有个问我:在Asp.net的HttpCookie中写入汉字,读取值为什么全是乱码?其实这是因为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来!其实解决的方法很简单:只要在写入Cook ...
- 学习java随笔第八篇:封装、继承、多态
java和c#一样都是面向对象的语言. 面向对象的语言有三大特征:封装.继承.多态 封装 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. class Perso ...
- Android开发必备:颜色选择
AA 指定透明度. 00 是完全透明. FF 是完全不透明.超出取值范围的值将被恢复为默认值. ffff00 ffff33 ffff66 ffff99 ffffcc ffffff ffcc0 ...
- css - div垂直方向滚动
只要设置 OVERFLOW-Y:auto;OVERFLOW-X:hidden即可.
- java - 异常浅谈
java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...
- Script: Who’s using a database link?(找出谁在使用dblink)
Every once in awhile it is useful to find out which sessions are using a database link in an Oracle ...
- Angularjs总结(四)$on、$emit和$broadcast的使用
开发中有时候会需要控制器之间的传值操作:下面几个操作可以达到所需, 注:无平级之间的操作 $emit只能向父 controller传递event与data$broadcast只能向子 controll ...