mainform.cpp

来自「C++ BUILDER精彩编程实例集锦(源码)3 第五部分 系统编程 第六部」· C++ 代码 · 共 102 行

CPP
102
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Mainform.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
    HDESK DesktopHandle;
    bool Result;
    SECURITY_DESCRIPTOR sd;
    SECURITY_ATTRIBUTES sa;
    LPSECURITY_ATTRIBUTES lpsa = NULL;
    OSVERSIONINFO osv;
    osv.dwOSVersionInfoSize = sizeof(osv);
    GetVersionEx(&osv);
    if(osv.dwPlatformId == VER_PLATFORM_WIN32_NT)  //NT系统需要指定lpsa参数
    {
       InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
       SetSecurityDescriptorDacl(&sd, true, NULL, false);
       sa.nLength = sizeof(SECURITY_ATTRIBUTES);
       sa.bInheritHandle = true;
       sa.lpSecurityDescriptor = &sd;
       lpsa = &sa;
    }
    STARTUPINFO si;
    memset(&si, 0, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
    si.wShowWindow = SW_SHOW;
    si.lpDesktop = "MyDesktop";
    PROCESS_INFORMATION pi;  //尝试打开特定的桌面
    DesktopHandle = OpenDesktop("MyDesktop",DF_ALLOWOTHERACCOUNTHOOK,
                        true,DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
                        DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL	|
                        DESKTOP_JOURNALPLAYBACK	|
                        DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS	|
                        DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS);
    if(!DesktopHandle)   //打开失败则创建该桌面
    {
       DesktopHandle = CreateDesktop("MyDesktop",NULL,NULL,
                        DF_ALLOWOTHERACCOUNTHOOK,
                        DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
                        DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL	|
                        DESKTOP_JOURNALPLAYBACK	|
                        DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS	|
                        DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS,
                        lpsa);
       if(!DesktopHandle)
       {
          ShowMessage("DeskTop Create Error!");
       }
       Result = false;    //特定桌面不存在,当前进程肯定没有运行在特定桌面
    }
    else       //特定的桌面存在,则判断当前的Application是否运行于该桌面
    {
       STARTUPINFO SI;
       GetStartupInfo(&SI);    //获取启动信息
       if(AnsiString(SI.lpDesktop).Pos("MyDesktop"))   //比较Desktop参数
       {
          Result = true;  //程序运行在正确(特定的'MyDeskTop')的桌面
       }
       else
       {
          Result = false; //程序没有运行在特定的桌面
       }
    }
    if(Result == false && DesktopHandle)//特定的桌面存在,并且当前进程不在特定的桌面
    {//则创建当前进程的一个新的运行副本,同时指定运行在特定的桌面
       if( CreateProcess(NULL, Application->ExeName.c_str(),
                          lpsa, lpsa, true, 0, 0, 0, &si, &pi))
       {
          SwitchDesktop(DesktopHandle);    //切换到特定的桌面,否则新的程序进程将看不到
       }
       else
       {
          CloseDesktop(DesktopHandle);
          ShowMessage("Process Creat Error!");
       }
    }
    CloseDesktop(DesktopHandle);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
  this->Close();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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