Loading... https://docs.microsoft.com/zh-tw/previous-versions/windows/desktop/legacy/ms682612(v=vs.85) 经历过Windows 95以及之前版本的用户,都对Windows98之后的Windows可以支持多个显卡惊讶不已,其实从Windows98开始,Windows系统也可以支持多个桌面了,新的API提供了一组使用Desktop桌面和Workstaion工作站的函数: CloseDesktop CloseWindowStation CreateDesktop CreateWindowStation EnumDesktopProc EnumDesktops EnumDesktopWindows EnumWindowStationProc EnumWindowStations GetProcessWindowStation GetThreadDesktop GetUserObjectInformation GetUserObjectSecurity OpenDesktop OpenInputDesktop OpenWindowStation SetProcessWindowStation SetThreadDesktop SetUserObjectInformation SetUserObjectSecurity SwitchDesktop 这些函数通常使用到的机会并不是很多,而且并不是十分具有很好的实用价值,但是,如果如果希望你的程序实现一些特殊的用途,使用这组API则可以事半功倍,比如有很多系统像超市的Pos收银、记费等专业用途的程序,总是希望工作环境尽量的单一,甚至桌面没有开始菜单,各种图标,只有业务软件在运行,通常的做法是修改Windows的设置,将Shell给屏蔽掉,或者利用Windows“策略”来实现,这样作也会带来缺点,不使用业务软件的时候,计算机将没有任何用处。本文中的实例程序就可以很容易的实现这个功能,而不需要对系统作任何修订,当然使用的操作系统必须是Windows98以后的版本。 除了Desktop之外,Workstaion也是Windows98的一个新特征,Workstaion就是工作站,相当于在一个计算机上虚拟出别的工作站,至于他们的用途,用的好的话也许会很广泛,用的不好也许会宕机,我们后面的例子就是使用Workstation实现同时使用多个剪切板的功能。 首先我门来看一下Desktop和Workstation有什么特点。 Desktop在Windows的SDK这样描述: A desktop is a secure object contained within a window station object.A desktop has a logical display surface and contains windows, menus, and hooks. 这是一个逻辑上的层面,可以容纳其他的窗体、包括独立的Hooks和菜单(开始菜单、桌面快捷菜单等)。我们通常工作的桌面就是Desktop中的一个。 Workstation在Windows的SDK中这样描述: A window station is a secure object that contains a set of global atoms, a clipboard, and a set of desktop objects. 显然桌面是属于工作站的,这个没有违反客观规律,尽管一个系统中的桌面和工作站都是逻辑上的。工作站可以拥有独立的Atoms序列,剪切板,和桌面等。 上面这一组函数的使用方法,这里不想多说,帮助里面的更加正确和详细,稍微翻阅就可以搞定。 关于Desktop和Workstaion的应用自然限定在上述的范围之内,下面将给出两个简单的应用示范。 一个是Desktop的,这个程序通常情况下启动,没有什么特别的,当使用“ / O”参数启动的时候,将会判断运行的桌面,如果程序不是运行在特定的桌面,就会返回,同时创建另一个运行在特定桌面的进程。这个特定的桌面不包括开始菜单,桌面的其他元素,是一个没有Shell的桌面。当程序结束的时候,如果是运行在特定桌面的将会关闭该桌面,也就是返回系统的缺省桌面。 下面是简单的枚举桌面 ```cpp #include <Windows.h> #include <iostream> #include <wchar.h> #include "LzmaLib.h" //#pragma comment(lib,"LZMA.lib") HANDLE g_hWnd; // BOOL CALLBACK EnumWindowsProc(__in HWND hwnd, __in LPARAM lParam) { if (g_hWnd == hwnd) { //cout << "Found window"; return FALSE; } return TRUE; } BOOL CALLBACK EnumDesktopProc( __in LPTSTR lpszDesktop, __in LPARAM lParam ) { printf("FindDesktop:%s", lpszDesktop); //枚举桌面窗口 //EnumDesktopWindows(OpenDesktop(lpszDesktop, DF_ALLOWOTHERACCOUNTHOOK, FALSE, DESKTOP_ENUMERATE), EnumWindowsProc, NULL); return true; } BOOL CALLBACK EnumWindowStationProc( __in LPTSTR lpszWindowStation, __in LPARAM lParam ) { printf("FindStation:%s\n", lpszWindowStation); EnumDesktops(OpenWindowStation(lpszWindowStation, FALSE, WINSTA_ALL_ACCESS), EnumDesktopProc, NULL); return true; } int main() { Sleep(3000); g_hWnd = GetForegroundWindow(); //Here i switch to kaspersky window to get it's handle //获取活动窗口 EnumWindowStations(EnumWindowStationProc, NULL); //I call EnumDesktopWindows in EnumDesktops in EnumWindowStations to search in all HWND of my Operation System. } ``` 示例: 在创建的桌面中,启动自己的程序,运行需要自己更改 ```cpp char Desktopname[] ={"Irihane"}; CreateDesktop(DesktopName,null,null,0,GENERIC_ALL,null); StartInfo:TStartupInfo; FillChar(StartInfo, sizeof(StartInfo), 0); StartInfo.cb:=sizeof(StartInfo); StartInfo.lpDesktop:=PChar(DesktopName); //指定Desktop的名称即可 StartInfo.wShowWindow:=SW_HIDE; StartInfo.dwFlags:=STARTF_USESHOWWINDOW; StartInfo.hStdError:=0; StartInfo.hStdInput:=0; StartInfo.hStdOutput:=0; if not CreateProcess(PChar(FileName),nil,nil,nil,true,CREATE_NEW_CONSOLE+HIGH_PRIORITY_CLASS,nil,PChar(ExtractFilePath(FilePath)),StartInfo,FProceInfo) ``` 最后修改:2021 年 12 月 02 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏