Android 12系统源码_窗口管理(七)DisplayContent简介

前言

DisplayContent 用于管理屏幕,一块DisplayContent 对象实例代表一个屏幕设备,这样有多个屏幕的设备就可以创建多个DisplayContent 对象,虽然多数设备只有一个显示屏,但它们同样可以创建多个 DisplayContent 对象,如投屏的时候,可以创建一个虚拟的DisplayContent,DisplayContent会根据窗口的显示位置将窗口进行分组,隶属于同一个DisplayContent的窗口将会显示在同一个屏幕中,每一个DisplayContent都对应一个唯一的ID,在添加窗口时可以通过指定这个ID决定其将被显示在对应的个屏幕中。DisplayContent是一个非常具有隔离性的一个概念。处于不同DisplayContent的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合。因此,就这几个方面来说, DisplayContent就像一个孤岛,所有这些操作都可以在其内部独立执行,DisplayContent使得这些原本属于整个WMS全局性的操作,变成了DisplayContent内部的操作。

一、DisplayContent 的创建

1、DisplayContent对象实例的创建最早是在SystemServer中被触发的。

frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer implements Dumpable {

    private ActivityManagerService mActivityManagerService;

    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    		...代码省略...
            t.traceBegin("SetWindowManagerService");
            mActivityManagerService.setWindowManager(wm);//创建屏幕设备对象
            t.traceEnd();
            ...代码省略...
    }
}

该方法会调用ActivityManagerService的setWindowManager方法。

2、ActivityManagerService的setWindowManager方法如下所示。

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {
    
    public WindowManagerService mWindowManager;
    public ActivityTaskManagerService mActivityTaskManager;
    
    public void setWindowManager(WindowManagerService wm) {
        synchronized (this) {
            mWindowManager = wm;
            mWmInternal = LocalServices.getService(WindowManagerInternal.class);
            mActivityTaskManager.setWindowManager(wm);//创建屏幕设备对象
        }
    }
}

该方法会调用ActivityTaskManagerService的setWindowManager方法。

3、ActivityTaskManagerService的setWindowManager方法如下所示。

frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

    RootWindowContainer mRootWindowContainer;

    public void setWindowManager(WindowManagerService wm) {
        synchronized (mGlobalLock) {
            mWindowManager = wm;
            mRootWindowContainer = wm.mRoot;//获取WindowManagerService的RootWindowContainer对象
            mWindowOrganizerController.setWindowManager(wm);
            mTempConfig.setToDefaults();
            mTempConfig.setLocales(LocaleList.getDefault());
            mConfigurationSeq = mTempConfig.seq = 1;
            mRootWindowContainer.onConfigurationChanged(mTempConfig);
            mLockTaskController.setWindowManager(wm);
            mTaskSupervisor.setWindowManager(wm);
            mRootWindowContainer.setWindowManager(wm);//创建屏幕设备对象
        }
    }
 }

该方法会继续调用RootWindowContainer的setWindowManager方法。

4、DisplayContent对象实例就是在RootWindowContainer的setWindowManager方法中创建的。

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

class RootWindowContainer extends WindowContainer<DisplayContent>
        implements DisplayManager.DisplayListener {

    DisplayManager mDisplayManager;
    /** Reference to default display so we can quickly look it up. */
    private DisplayContent mDefaultDisplay;

    void setWindowManager(WindowManagerService wm) {
        mWindowManager = wm;
        mDisplayManager = mService.mContext.getSystemService(DisplayManager.class);
        mDisplayManager.registerDisplayListener(this, mService.mUiHandler);
        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);

        final Display[] displays = mDisplayManager.getDisplays();//通过DisplayManager获取屏幕设备信息
        for (int displayNdx = 0; displayNdx < displays.length; ++displayNdx) {//遍历屏幕设备,为每个设备创建DisplayContent对象
            final Display display = displays[displayNdx];
            final DisplayContent displayContent = new DisplayContent(display, this);//创建屏幕对象DisplayContent实例
            addChild(displayContent, POSITION_BOTTOM);
            if (displayContent.mDisplayId == DEFAULT_DISPLAY) {
                mDefaultDisplay = displayContent;
            }
        }
        calculateDefaultMinimalSizeOfResizeableTasks();

        final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea();
        defaultTaskDisplayArea.getOrCreateRootHomeTask(ON_TOP);
        positionChildAt(POSITION_TOP, defaultTaskDisplayArea.mDisplayContent,
                false /* includingParents */);
    }
    
    //添加新创建的DisplayContent屏幕设备对象,将其存储到父类属性mChildren集合中
    void addChild(E child, int index) {
        if (!child.mReparenting && child.getParent() != null) {
            throw new IllegalArgumentException("addChild: container=" + child.getName()
                    + " is already a child of container=" + child.getParent().getName()
                    + " can't add to container=" + getName()
                    + "\n callers=" + Debug.getCallers(15, "\n"));
        }

        if ((index < 0 && index != POSITION_BOTTOM)
                || (index > mChildren.size() && index != POSITION_TOP)) {
            throw new IllegalArgumentException("addChild: invalid position=" + index
                    + ", children number=" + mChildren.size());
        }

        if (index == POSITION_TOP) {
            index = mChildren.size();
        } else if (index == POSITION_BOTTOM) {
            index = 0;
        }
		//将DisplayContent屏幕设备对象存储到父类属性mChildren集合中
        mChildren.add(index, child);

        // Set the parent after we've actually added a child in case a subclass depends on this.
        child.setParent(this);
    }
}

frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java

class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
        implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable {
	protected final WindowList<E> mChildren = new WindowList<E>();
}

1)首先通过DisplayManager获取当前存在的屏幕设备信息数组,然后遍历该数组为每个屏幕设备创建对应的DisplayContent对象实例。
2)调用addChild方法依次将创建的DisplayContent对象实例存储到父类的mChildren集合中。

二、DisplayContent类定义

frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java

class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.DisplayContentInfo {

    /**
     * Create new {@link DisplayContent} instance, add itself to the root window container and
     * initialize direct children.
     * @param display May not be null.
     * @param root {@link RootWindowContainer}
     */
    DisplayContent(Display display, RootWindowContainer root) {
        super(root.mWindowManager, "DisplayContent", FEATURE_ROOT);
        if (mWmService.mRoot.getDisplayContent(display.getDisplayId()) != null) {
            throw new IllegalArgumentException("Display with ID=" + display.getDisplayId()
                    + " already exists="
                    + mWmService.mRoot.getDisplayContent(display.getDisplayId())
                    + " new=" + display);
        }

        mRootWindowContainer = root;
        mAtmService = mWmService.mAtmService;
        mDisplay = display;
        mDisplayId = display.getDisplayId();
        mCurrentUniqueDisplayId = display.getUniqueId();
        mOffTokenAcquirer = mRootWindowContainer.mDisplayOffTokenAcquirer;
        mWallpaperController = new WallpaperController(mWmService, this);
        display.getDisplayInfo(mDisplayInfo);
        display.getMetrics(mDisplayMetrics);
        mSystemGestureExclusionLimit = mWmService.mConstants.mSystemGestureExclusionLimitDp
                * mDisplayMetrics.densityDpi / DENSITY_DEFAULT;
        isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
        mInsetsStateController = new InsetsStateController(this);
        mDisplayFrames = new DisplayFrames(mDisplayId, mInsetsStateController.getRawInsetsState(),
                mDisplayInfo, calculateDisplayCutoutForRotation(mDisplayInfo.rotation),
                calculateRoundedCornersForRotation(mDisplayInfo.rotation),
                calculatePrivacyIndicatorBoundsForRotation(mDisplayInfo.rotation));
        initializeDisplayBaseInfo();

        mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
        mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
        mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
        mAppTransitionController = new AppTransitionController(mWmService, this);
        mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);

        final InputChannel inputChannel = mWmService.mInputManager.monitorInput(
                "PointerEventDispatcher" + mDisplayId, mDisplayId);
        mPointerEventDispatcher = new PointerEventDispatcher(inputChannel, this);

        // Tap Listeners are supported for:
        // 1. All physical displays (multi-display).
        // 2. VirtualDisplays on VR, AA (and everything else).
        mTapDetector = new TaskTapPointerEventListener(mWmService, this);
        registerPointerEventListener(mTapDetector);
        registerPointerEventListener(mWmService.mMousePositionTracker);
        if (mWmService.mAtmService.getRecentTasks() != null) {
            registerPointerEventListener(
                    mWmService.mAtmService.getRecentTasks().getInputListener());
        }

        mDisplayPolicy = new DisplayPolicy(mWmService, this);
        mDisplayRotation = new DisplayRotation(mWmService, this);
        mCloseToSquareMaxAspectRatio = mWmService.mContext.getResources().getFloat(
                com.android.internal.R.dimen.config_closeToSquareDisplayMaxAspectRatio);
        if (isDefaultDisplay) {
            // The policy may be invoked right after here, so it requires the necessary default
            // fields of this display content.
            mWmService.mPolicy.setDefaultDisplay(this);
        }
        if (mWmService.mDisplayReady) {
            mDisplayPolicy.onConfigurationChanged();
        }
        if (mWmService.mSystemReady) {
            mDisplayPolicy.systemReady();
        }
        mWindowCornerRadius = mDisplayPolicy.getWindowCornerRadius();
        mDividerControllerLocked = new DockedTaskDividerController(this);
        mPinnedTaskController = new PinnedTaskController(mWmService, this);

        final Transaction pendingTransaction = getPendingTransaction();
        configureSurfaces(pendingTransaction);
        pendingTransaction.apply();

        // Sets the display content for the children.
        onDisplayChanged(this);
        updateDisplayAreaOrganizers();

        mInputMonitor = new InputMonitor(mWmService, this);
        mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this);

        if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Creating display=" + display);

        mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this);
    }
}
根据提供的引用内容,我们可以得知WMIC是一种用于在Windows系统上执行WMI查询的命令行工具。在这里,`/every`是WMIC命令的一个选项,它用于显示所有可用的WMI别名和属性。 要使用`wmic /every`命令,请按照以下步骤操作: 1. 打开命令提示符。 2. 键入`wmic /every`并按Enter键。 3. 稍等片刻,系统将显示所有可用的WMI别名和属性。 以下是一个示例输出: ``` :\>wmic /every CLASS: Win32_1394Controller CLASS: Win32_1394ControllerDevice CLASS: Win32_Account CLASS: Win32_AccountSID CLASS: Win32_ACE CLASS: Win32_ActionCheck CLASS: Win32_AllocatedResource CLASS: Win32_ApplicationCommandLine CLASS: Win32_ApplicationService CLASS: Win32_AssociatedBattery CLASS: Win32_AssociatedProcessorMemory CLASS: Win32_BaseBoard CLASS: Win32_BaseService CLASS: Win32_Battery CLASS: Win32_Binary CLASS: Win32_BindImageAction CLASS: Win32_BIOS CLASS: Win32_BootConfiguration CLASS: Win32_Bus CLASS: Win32_CacheMemory CLASS: Win32_CDROMDrive CLASS: Win32_CheckCheck CLASS: Win32_CIMLogicalDeviceCIMDataFile CLASS: Win32_ClassicCOMApplicationClasses CLASS: Win32_ClassicCOMClass CLASS: Win32_ClassicCOMClassSetting CLASS: Win32_ClassicCOMClassSettings CLASS: Win32_ClassInfoAction CLASS: Win32_ClientApplicationSetting CLASS: Win32_CodecFile CLASS: Win32_COMApplication CLASS: Win32_COMApplicationClasses CLASS: Win32_COMApplicationSettings CLASS: Win32_COMClass CLASS: Win32_ComClassAutoEmulator CLASS: Win32_ComClassEmulator CLASS: Win32_CommandLineAccess CLASS: Win32_ComponentCategory CLASS: Win32_ComputerSystem CLASS: Win32_ComputerSystemProcessor CLASS: Win32_ComputerSystemProduct CLASS: Win32_COMSetting CLASS: Win32_Condition CLASS: Win32_ConnectionShare CLASS: Win32_ControllerHastHub CLASS: Win32_CreateFolderAction CLASS: Win32_CurrentProbe CLASS: Win32_DCOMApplication CLASS: Win32_DCOMApplicationAccessAllowedSetting CLASS: Win32_DCOMApplicationLaunchAllowedSetting CLASS: Win32_DCOMApplicationSetting CLASS: Win32_DependentService CLASS: Win32_Desktop CLASS: Win32_DesktopMonitor CLASS: Win32_DeviceBus CLASS: Win32_DeviceMemoryAddress CLASS: Win32_DeviceSettings CLASS: Win32_Directory CLASS: Win32_DirectorySpecification CLASS: Win32_DiskDrive CLASS: Win32_DiskDriveToDiskPartition CLASS: Win32_DiskPartition CLASS: Win32_DisplayConfiguration CLASS: Win32_DisplayControllerConfiguration CLASS: Win32_DMAChannel CLASS: Win32_DriverVXD CLASS: Win32_DuplicateFileAction CLASS: Win32_Environment CLASS: Win32_EnvironmentSpecification CLASS: Win32_ExtensionInfoAction CLASS: Win32_Fan CLASS: Win32_FileSpecification CLASS: Win32_FloppyController CLASS: Win32_FloppyDrive CLASS: Win32_FontInfoAction CLASS: Win32_Group CLASS: Win32_GroupUser CLASS: Win32_HeatPipe CLASS: Win32_IDEController CLASS: Win32_IDEControllerDevice CLASS: Win32_ImplementedCategory CLASS: Win32_InfraredDevice CLASS: Win32_IniFileSpecification CLASS: Win32_InstalledSoftwareElement CLASS: Win32_IRQResource CLASS: Win32_Keyboard CLASS: Win32_LaunchCondition CLASS: Win32_LoadOrderGroup CLASS: Win32_LoadOrderGroupServiceDependencies CLASS: Win32_LoadOrderGroupServiceMembers CLASS: Win32_LogicalDisk CLASS: Win32_LogicalDiskRootDirectory CLASS: Win32_LogicalDiskToPartition CLASS: Win32_LogicalFileAccess CLASS: Win32_LogicalFileAuditing CLASS: Win32_LogicalFileGroup CLASS: Win32_LogicalFileOwner CLASS: Win32_LogicalFileSecuritySetting CLASS: Win32_LogicalMemoryConfiguration CLASS: Win32_LogicalProgramGroup CLASS: Win32_LogicalProgramGroupDirectory CLASS: Win32_LogicalProgramGroupItem CLASS: Win32_LogicalProgramGroupItemDataFile CLASS: Win32_LogicalShareAccess CLASS: Win32_LogicalShareAuditing CLASS: Win32_LogicalShareSecuritySetting CLASS: Win32_ManagedSystemElementResource CLASS: Win32_MemoryArray CLASS: Win32_MemoryArrayLocation CLASS: Win32_MemoryDevice CLASS: Win32_MemoryDeviceArray CLASS: Win32_MemoryDeviceLocation CLASS: Win32_MethodParameterClass CLASS: Win32_MIMEInfoAction CLASS: Win32_MotherboardDevice CLASS: Win32_MoveFileAction CLASS: Win32_MSIResource CLASS: Win32_NamedJobObject CLASS: Win32_NamedJobObjectActgInfo CLASS: Win32_NamedJobObjectLimit CLASS: Win32_NamedJobObjectLimitSetting CLASS: Win32_NamedJobObjectProcess CLASS: Win32_NamedJobObjectSecLimit CLASS: Win32_NamedJobObjectSecLimitSetting CLASS: Win32_NamedJobObjectStatistics CLASS: Win32_NetworkAdapter CLASS: Win32_NetworkAdapterConfiguration CLASS: Win32_NetworkAdapterSetting CLASS: Win32_NetworkClient CLASS: Win32_NetworkConnection CLASS: Win32_NetworkLoginProfile CLASS: Win32_NetworkProtocol CLASS: Win32_NTEventlogFile CLASS: Win32_NTLogEvent CLASS: Win32_NTLogEventComputer CLASS: Win32_NTLogEventLog CLASS: Win32_NTLogEventUser CLASS: Win32_ODBCAttribute CLASS: Win32_ODBCDataSourceAttribute CLASS: Win32_ODBCDataSourceSpecification CLASS: Win32_ODBCDriverAttribute CLASS: Win32_ODBCDriverSoftwareElement CLASS: Win32_ODBCDriverSpecification CLASS: Win32_ODBCSourceAttribute CLASS: Win32_ODBCTranslatorSpecification CLASS: Win32_OnBoardDevice CLASS: Win32_OperatingSystem CLASS: Win32_OperatingSystemQFE CLASS: Win32_OSRecoveryConfiguration CLASS: Win32_PageFile CLASS: Win32_PageFileElementSetting CLASS: Win32_PageFileSetting CLASS: Win32_PageFileUsage CLASS: Win32_ParallelPort CLASS: Win32_Patch CLASS: Win32_PatchFile CLASS: Win32_PatchPackage CLASS: Win32_PCMCIAController CLASS: Win32_Perf CLASS: Win32_PerfRawData CLASS: Win32_PerfRawData_ASP_ActiveServerPages CLASS: Win32_PerfRawData_ASPNET_114322_ASPNETAppsv114322 CLASS: Win32_PerfRawData_ASPNET_114322_ASPNETv114322 CLASS: Win32_PerfRawData_ASPNET_ASPNET CLASS: Win32_PerfRawData_ASPNET_ASPNETApplications CLASS: Win32_PerfRawData_IAS_IASAccountingClients CLASS: Win32_PerfRawData_IAS_IASAccountingServer CLASS: Win32_PerfRawData_IAS_IASAuthenticationClients CLASS: Win32_PerfRawData_IAS_IASAuthenticationServer CLASS: Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal CLASS: Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator CLASS: Win32_PerfRawData_MSFTPSVC_FTPService CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerBackupDevice CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerBufferPartition CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerCacheManager CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerLatches CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerLocks CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationAgents CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationDist CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationLogreader CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationMerge CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationSnapshot CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics CLASS: Win32_PerfRawData_MSSQLSERVER_SQLServerUserSettable CLASS: Win32_PerfRawData_NETFramework_NETCLRExceptions CLASS: Win32_PerfRawData_NETFramework_NETCLRInterop CLASS: Win32_PerfRawData_NETFramework_NETCLRJit CLASS: Win32_PerfRawData_NETFramework_NETCLRLoading CLASS: Win32_PerfRawData_NETFramework_NETCLRLocksAndThreads CLASS: Win32_PerfRawData_NETFramework_NETCLRMemory CLASS: Win32_PerfRawData_NETFramework_NETCLRRemoting CLASS: Win32_PerfRawData_NETFramework_NETCLRSecurity CLASS: Win32_PerfRawData_Outlook_Outlook CLASS: Win32_PerfRawData_PerfDisk_PhysicalDisk CLASS: Win32_PerfRawData_PerfNet_Browser CLASS: Win32_PerfRawData_PerfNet_Redirector CLASS: Win32_PerfRawData_PerfNet_Server CLASS: Win32_PerfRawData_PerfNet_ServerWorkQueues CLASS: Win32_PerfRawData_PerfOS_Cache CLASS: Win32_PerfRawData_PerfOS_Memory CLASS: Win32_PerfRawData_PerfOS_Objects CLASS: Win32_PerfRawData_PerfOS_PagingFile CLASS: Win32_PerfRawData_PerfOS_Processor CLASS: Win32_PerfRawData_PerfOS_System CLASS: Win32_PerfRawData_PerfProc_FullImage_Costly CLASS: Win32_PerfRawData_PerfProc_Image_Costly CLASS: Win32_PerfRawData_PerfProc_JobObject CLASS: Win32_PerfRawData_PerfProc_JobObjectDetails CLASS: Win32_PerfRawData_PerfProc_Process CLASS: Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly CLASS: Win32_PerfRawData_PerfProc_Thread CLASS: Win32_PerfRawData_PerfProc_ThreadDetails_Costly CLASS: Win32_PerfRawData_RemoteAccess_RASPort CLASS: Win32_PerfRawData_RemoteAccess_RASTotal CLASS: Win32_PerfRawData_RSVP_ACSPerRSVPService CLASS: Win32_PerfRawData_Spooler_PrintQueue CLASS: Win32_PerfRawData_TapiSrv_Telephony CLASS: Win32_PerfRawData_Tcpip_ICMP CLASS: Win32_PerfRawData_Tcpip_IP CLASS: Win32_PerfRawData_Tcpip_NBTConnection CLASS: Win32_PerfRawData_Tcpip_NetworkInterface CLASS: Win32_PerfRawData_Tcpip_TCP CLASS: Win32_PerfRawData_Tcpip_UDP CLASS: Win32_PerfRawData_TermService_TerminalServices CLASS: Win32_PerfRawData_TermService_TerminalServicesSession CLASS: Win32_PerfRawData_W3SVC_WebService CLASS: Win32_PhysicalMedia CLASS: Win32_PhysicalMemory CLASS: Win32_PhysicalMemoryArray CLASS: Win32_PhysicalMemoryLocation CLASS: Win32_PNPAllocatedResource CLASS: Win32_PnPDevice CLASS: Win32_PnPEntity CLASS: Win32_PointingDevice CLASS: Win32_PortableBattery CLASS: Win32_PortConnector CLASS: Win32_PortResource CLASS: Win32_POTSModem CLASS: Win32_POTSModemToSerialPort CLASS: Win32_PowerManagementEvent CLASS: Win32_Printer CLASS: Win32_PrinterConfiguration CLASS: Win32_PrinterController CLASS: Win32_PrinterDriverDll CLASS: Win32_PrinterSetting CLASS: Win32_PrinterShare CLASS: Win32_PrintJob CLASS: Win32_PrivilegesStatus CLASS: Win32_Process CLASS: Win32_Processor CLASS: Win32_ProcessStartup CLASS: Win32_Product CLASS: Win32_ProductCheck CLASS: Win32_ProductResource CLASS: Win32_ProductSoftwareFeatures CLASS: Win32_ProgIDSpecification CLASS: Win32_ProgramGroup CLASS: Win32_ProgramGroupContents CLASS: Win32_ProgramGroupOrItem CLASS: Win32_Property CLASS: Win32_ProtocolBinding CLASS: Win32_PublishComponentAction CLASS: Win32_QuickFixEngineering CLASS: Win32_Refrigeration CLASS: Win32_Registry CLASS: Win32_RegistryAction CLASS: Win32_RemoveFileAction CLASS: Win32_RemoveIniAction CLASS: Win32_ReserveCost CLASS: Win32_ScheduledJob CLASS: Win32_SCSIController CLASS: Win32_SCSIControllerDevice CLASS: Win32_SecurityDescriptor CLASS: Win32_SecuritySetting CLASS: Win32_SecuritySettingAccess CLASS: Win32_SecuritySettingAuditing CLASS: Win32_SecuritySettingGroup CLASS: Win32_SecuritySettingOfLogicalFile CLASS: Win32_SecuritySettingOfLogicalShare CLASS: Win32_SecuritySettingOfObject CLASS: Win32_SecuritySettingOwner CLASS: Win32_SelfRegModuleAction CLASS: Win32_SerialPort CLASS: Win32_SerialPortConfiguration CLASS: Win32_SerialPortSetting CLASS: Win32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值