⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 Virtual Desktop虚拟桌面很简单的实现
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows,  Controls, Forms,SysUtils,    LMDGlobalHotKey,
  ComCtrls, XPMan, Menus, RzTray, StdCtrls, Classes,messages;
const
  CM_RESTORE = WM_USER + $1000; // 自定义一个消息,用来恢复窗口
  APPNAME = '虚拟桌面';    // 应用程序名称

type
  TForm1 = class(TForm)
    RzTrayIcon1: TRzTrayIcon;
    PopupMenu1: TPopupMenu;
    close1: TMenuItem;
    Label4: TLabel;
    XPManifest1: TXPManifest;
    Button1: TButton;
    Label1: TLabel;
    N1: TMenuItem;
    N2: TMenuItem;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    N41: TMenuItem;
    N51: TMenuItem;
    N61: TMenuItem;
    N71: TMenuItem;
    N81: TMenuItem;
    N91: TMenuItem;
    N101: TMenuItem;
    N111: TMenuItem;
    N121: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure close1Click(Sender: TObject);
    procedure LMDGlobalHotKeyKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N1Click(Sender: TObject);
    procedure N11Click(Sender: TObject);

  private
    { Private declarations }
  public
    procedure CreateParams(var Params: TCreateParams); override;
    Procedure RestoreRequest(var message: TMessage); message CM_RESTORE;    { Public declarations }
    { Public declarations }
  end;

var
  Form1: TForm1;
  LMDGlobalHotKey1: TLMDGlobalHotKey;
  LMDGlobalHotKey2: TLMDGlobalHotKey;
  LMDGlobalHotKey3: TLMDGlobalHotKey;
  LMDGlobalHotKey4: TLMDGlobalHotKey;
  LMDGlobalHotKey5: TLMDGlobalHotKey;
  LMDGlobalHotKey6: TLMDGlobalHotKey;
  LMDGlobalHotKey7: TLMDGlobalHotKey;
  LMDGlobalHotKey8: TLMDGlobalHotKey;
  LMDGlobalHotKey9: TLMDGlobalHotKey;
  LMDGlobalHotKey10: TLMDGlobalHotKey;
  LMDGlobalHotKey11: TLMDGlobalHotKey;
  LMDGlobalHotKey12: TLMDGlobalHotKey;

implementation

{$R *.dfm}
procedure Tform1.CreateParams(var Params: TCreateParams);
begin
  // 设置应用程序名称
  inherited CreateParams(Params);
  Params.WinClassName := APPNAME;
end;

procedure Tform1.RestoreRequest(var message: TMessage);
begin
  // 接到自定义的消息后,如果处于最小化状态则恢复,否则放置到桌面的最前面
  MessageBox(Handle,'程序" '+APPNAME+'" 已经运行了。','信息',MB_OK+MB_ICONINFORMATION+MB_SYSTEMMODAL);
{  if IsIconic(Application.Handle) = TRUE then
    Application.Restore
  else
    Application.BringToFront;}
end;

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
      Application.MessageBox(PChar('打开桌面失败!' + #13#10 + SysErrorMessage(GetLastError)), '错误', MB_OK +   MB_ICONSTOP);
      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
      Application.MessageBox(pchar('进程创建失败!' + #13#10 + SysErrorMessage(GetLastError)), '错误', MB_OK +   MB_ICONSTOP);
      CloseDesktop(DsktpHandle);
      Exit;
    end;
  end;
  SwitchDesktop(DsktpHandle);
end;

procedure init(LMDGlobalHotKey: TLMDGlobalHotKey; Key: integer);
begin
  LMDGlobalHotKey := TLMDGlobalHotKey.Create(Form1);
  LMDGlobalHotKey.HotKey := TextToShortCut('Ctrl+F' + Trim(IntToStr(Key)));
  LMDGlobalHotKey.OnKeyDown := Form1.LMDGlobalHotKeyKeyDown;
  LMDGlobalHotKey.Active := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  init(LMDGlobalHotKey1, 1);
  init(LMDGlobalHotKey2, 2);
  init(LMDGlobalHotKey3, 3);
  init(LMDGlobalHotKey4, 4);
  init(LMDGlobalHotKey5, 5);
  init(LMDGlobalHotKey6, 6);
  init(LMDGlobalHotKey7, 7);
  init(LMDGlobalHotKey8, 8);
  init(LMDGlobalHotKey9, 9);
  init(LMDGlobalHotKey10, 10);
  init(LMDGlobalHotKey11, 11);
  init(LMDGlobalHotKey12, 12);
end;

procedure TForm1.close1Click(Sender: TObject);
begin
  close
end;

procedure TForm1.LMDGlobalHotKeyKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SwitchToDesktop(Key - 111);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  RzTrayIcon1.MinimizeApp;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RzTrayIcon1.MinimizeApp;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SwitchToDesktop(1);
end;

procedure TForm1.N1Click(Sender: TObject);
begin
   RzTrayIcon1.RestoreApp;
end;

procedure TForm1.N11Click(Sender: TObject);
begin
  SwitchToDesktop(StrToInt(Copy((sender as TMenuItem).Caption,5,2)));
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -