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 [ 1..4 ] 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[1..MAX_PATH] of char;
  PPath: PChar;
  StrPath: string;
  len: integer;
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
begin
  if number = 1 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 = 0 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 = 0 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, 0, 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 >0 then
  if Msg.WParam <=4 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, 1, MOD_CONTROL, VK_F1);
  RegisterHotKey(Handle, 2, MOD_CONTROL, VK_F2);
  RegisterHotKey(Handle, 3, MOD_CONTROL, VK_F3);
  RegisterHotKey(Handle, 4, MOD_CONTROL, VK_F4);
  RegisterHotKey(Handle, 5, MOD_CONTROL, VK_F5);
end;  

end. 

参考:http://www.cnblogs.com/key-ok/p/3417735.html

时间: 2024-10-13 19:22:22

Windows多桌面切换(CreateDesktop,SwitchDesktop函数)的相关文章

linux下字符界面与桌面切换的快捷键总结

首先桌面版的是带有图形化的,最出名的windows,专业点的用的linux. 我比较喜欢Ubuntu的和centos的版本. 如果想要界面互相切换,前提是你得装了桌面版的,如果没装肯定切换不了的. 切换到字符界面:ctrl+shift+alt+F1 切换到桌面界面:alr+F7 真实机下面:ctrl+alt+F1 切换到字符界面:alr+F7 原文链接:  linux下字符界面与桌面切换的快捷键总结

windows之桌面程序引导功能

经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过这供功能是怎么实现的呢,使用一般的窗口spy工具应该都能抓取windows系统桌面使用的窗口类,我使用彗星小助手抓取了下,效果如图1所示.原来windows桌面窗口是一个listview,那么问题就变得简单了,我们只需要拿到窗口句柄,并向其发送消息LVM_GETITEMCOUNT消息,获取到窗口it

Windows 7桌面显示图标窗口句柄的获取

在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );HWND hwndSysListView32 = ::FindWindow

本地Windows远程桌面连接阿里云Ubuntu服务器

本地Windows远程桌面连接阿里云Ubuntu 16.04服务器: 1.目的:希望通过本地的Windows远程桌面连接到阿里云的Ubuntu服务器,通过远程桌面图形界面的方式操作服务器. 2.条件:申请的阿里云Ubuntu服务器一台,本地Windows操作系统电脑一台. 3.如何远程桌面连接: (1)首先通过Windows系统下连接Linux系统的命令行工具连接Ubuntu服务器,(工具:xshell,securecrt,putty等). (2)通过Windows下工具连接到linux操作系统

如何使用windows远程桌面控制树莓派3B

文章开头先来吐槽一下网上的免费教程.虽然现在是信息时代,我们可以在网上学习各种各样的知识.但是网上的教程鱼龙混杂,缺少时间有效性.甚至有些纯粹是误导,只看到结果,根本不披露实现过程.这一点要鄙视一下.       在实际操作过程中,你会遇到很多问题,这些问题对于还是小白的你来说,如果百度查不到,那就会打击你对树莓派的信心,加速树莓派吃灰的进程.所以,我会不定期的更新树莓派3b 的教程,教你一步一步的玩转树莓派!每一篇文章我都会注明更新日期,方便大家查阅.好,闲言少叙,开始今天的正题:树莓派3B(

windows 远程桌面连接 RPi 2B

/************************************************************************* * windows 远程桌面连接 RPi 2B * 声明: * 本文主要记录windows下如何远程RPi 2B,通过ssh进去安装xrdp.设置USB * 无线网卡等工作. * * 2016-2-15 深圳 南山平山村 曾剑锋 ************************************************************

windows远程桌面连接

服务器端: 1.我的电脑->管理->本地用户和组->用户->新建用户设置账号密码,隶属于administrator和remote user 2.我的电脑->属性->远程设置->允许用户远程操作 3.远程桌面连接-选项->本地资源->详细信息->驱动器(选择) 用于复制粘贴功能 客户端: 1.远程桌面连接-选项->本地资源->详细信息->驱动器(选择) 用于复制粘贴功能 windows远程桌面连接,布布扣,bubuko.com

树莓派进阶之路 (024) - windows远程桌面连接树莓派通过xrdp服务(转)

本文转载:http://www.cnblogs.com/edgexie/p/6527992.html 在网上看到很多关于windows远程桌面连接树莓派的教程.我也按照教程试过了,遇到了几个坑.特意记录在这. 先说正确的步骤. 1. 必须先安装tightvncserver!!! sudo apt-get install tightvncserver 2. 再安装xrdp服务. sudo apt-get install xrdp 3. 如果开着防火墙ufw , 那么打开服务器上的远程桌面访问端口

Windows远程桌面:端口号更改&指定IP连接

由于工作需要,经常要使用远程桌面连接到Windows服务器.Windows的默认远程桌面端口号为3389,为增加服务器安全性,除了在硬件设备做规则外,还可以用Windows自带的策略来增加Windows服务器的安全下. 下面以Windows2008R2为例,分别设置二种策略:(两种任选一种,不能同时生效) 远程桌面端口号更改 高级防火墙指定IP连接 第一种方式:远程桌面端口号更改 注册表要更改二处,第一处路径如下 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS