GVKun编程网logo

应用程序窗口的 DCV NICE 强制框架更新(windows应用程序框架)

4

如果您想了解应用程序窗口的DCVNICE强制框架更新的相关知识,那么本文是一篇不可错过的文章,我们将对windows应用程序框架进行全面详尽的解释,并且为您提供关于Android应用程序窗口(Acti

如果您想了解应用程序窗口的 DCV NICE 强制框架更新的相关知识,那么本文是一篇不可错过的文章,我们将对windows应用程序框架进行全面详尽的解释,并且为您提供关于Android应用程序窗口(Activity)窗口对象(Window)创建指南、Autosizer应用程序窗口控制工具、c – 如何将其他应用程序窗口置于正面而不激活它?、c# – 屏幕抓取应用程序窗口并与鼠标和键盘进行交互的有价值的信息。

本文目录一览:

应用程序窗口的 DCV NICE 强制框架更新(windows应用程序框架)

应用程序窗口的 DCV NICE 强制框架更新(windows应用程序框架)

如何解决应用程序窗口的 DCV NICE 强制框架更新?

我在运行 Windows Server 2016 的 EC2 实例上使用 DCV NICE。我使用的是 QUIC 胖客户端。 我正在运行Matlab。 Matlab 可以创建一个子进程来显示一个“图形窗口”。当图形窗口中的元素发生变化时,我希望 DCV NICE 发送新帧。现在,当该窗口中的元素发生变化时,DCV NICE 不会发送新帧。当新帧每秒仅渲染一次时,很难旋转或平移对象。

如果我从 QUIC 胖客户端打开“Streaming Mode”窗口,我可以看到帧率。 当我打开一个 .text 文件并输入时,“Steaming Mode”窗口中列出的帧率和网络延迟会增加。当我与 MatLab figure 窗口中的对象交互时,帧率不会改变。

我在注册表中设置了这些值键以优化帧速率: \HKEY-USERS\S-1-5-18\Software\GSettings\com\nicesoftware\dcv\display: 帧队列权重:(8,5,1) 传输中帧:(2,12) qu带宽:50

(来自https://www.ni-sp.com/support/nice-dcv-tips-and-tricks/#h-location-of-nice-dcv-logfiles)

我认为这是帧问题而不是处理问题,因为当我在窗口中旋转图形时,任务管理器中的 GPU 使用率最多会跳到 15%。

Low Framerate,Low Network Latency

我尝试在 Matlab 中增加 Java 内存限制,但没有效果。

Matlab 正在使用连接到 EC2 实例的 GPU:

Matlab is using the GPU attached to the VM

我们如何帮助 DCV NICE 识别 MatLab 图形窗口中的变化? 问题出在其他地方吗?我还应该调查什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android应用程序窗口(Activity)窗口对象(Window)创建指南

Android应用程序窗口(Activity)窗口对象(Window)创建指南

       在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。

       从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,后者是从Window类继承下来的。Activity、Window和PhonwWindow三个类的关系可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图3和图5。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:


图1 Activity和Window的类关系图


图2 Window和PhoneWindow的类关系图

       上述两个图中所涉及到的类的描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文,本文主要从Android应用程序窗口的创建过程来理解Activity、Window和PhonwWindow三个类的关系。

       从Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文又可以知道,与Activity组件所关联的一个PhoneWindow对象是从Activity类的成员函数attach中创建的,如图3所示:


图3 Android应用程序窗口的创建过程

       这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。

       Step 1. Activity.attach

复制代码 代码如下:

public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback,KeyEvent.Callback,
OnCreateContextMenuListener,ComponentCallbacks {
......

private Window mWindow;
......

final void attach(Context context,ActivityThread aThread,
Instrumentation instr,IBinder token,int ident,
Application application,Intent intent,ActivityInfo info,
CharSequence title,Activity parent,String id,
Object lastNonConfigurationInstance,
HashMap<String,Object> lastNonConfigurationChildInstances,
Configuration config) {
......

mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
if (info.softInputMode != WindowManager.LayoutParams.soFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
......

mWindow.setwindowManager(null,mToken,mComponent.flattenToString());
......

}

......
}

        这个函数定义在文件frameworks/base/core/java/android/app/Activity.java中。

        在前面Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文中,我们已经分析过这个函数的实现了,这里我们只关注与应用程序窗口创建相关的代码。

        函数首先调用PolicyManager类的静态成员函数makeNewWindow来创建一个类型为PhoneWindow的应用程序窗口,并且保存在Activity类的成员变量mWindow中。有了这个类型为PhoneWindow的应用程序窗口,函数接下来还会调用它的成员函数setCallback、setSoftInputMode和setwindowManager来设置窗口回调接口、软键盘输入区域的显示模式和本地窗口管理器。

        PhoneWindow类的成员函数setCallback、setSoftInputMode和setwindowManager都是从父类Window继承下来的,因此,接下来我们就继续分析PolicyManager类的静态成员函数makeNewWindow,以及Window类的成员函数setCallback、setSoftInputMode和setwindowManager的实现。

        Step 2. PolicyManager.makeNewWindow

复制代码 代码如下:

public final class PolicyManager {
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";

private static final IPolicy sPolicy;

static {
// Pull in the actual implementation of the policy at run-time
try {
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be loaded",ex);
} catch (InstantiationException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be instantiated",ex);
} catch (illegalaccessexception ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be instantiated",ex);
}
}

......

// The static methods to spawn new policy-specific objects
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}

......
}

       这个函数定义在文件frameworks/base/core/java/com/android/internal/policy/PolicyManager.java中。

       PolicyManager是一个窗口管理策略类,它在第一次被使用的时候,就会创建一个Policy类实例,并且保存在静态成员变量sPolicy中,以后PolicyManager类的窗口管理策略就是通过这个Policy类实例来实现的,例如,PolicyManager类的静态成员函数makeNewWindow就是通过调用这个Policy类实例的成员函数makeNewWindow来创建一个具体的应用程序窗口的。

       接下来,我们就继续分析Policy类的成员函数makeNewWindow的实现。

       Step 3. Policy.makeNewWindow

复制代码 代码如下:

public class Policy implements IPolicy {
......

public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}

......
}

        这个函数定义在文件frameworks/base/policy/src/com/android/internal/policy/impl/Policy.java中。

        Policy类的成员函数makeNewWindow的实现很简单,它只是创建了一个PhoneWindow对象,然后返回给调用者。

        接下来,我们就继续分析PhoneWindow类的构造函数的实现,以便可以了解一个类型为PhoneWindow的应用程序窗口的创建过程。

        Step 4. new PhoneWindow

复制代码 代码如下:

public class PhoneWindow extends Window implements MenuBuilder.Callback {
......

// This is the top-level view of the window,containing the window decor.
private DecorView mDecor;

// This is the view in which the window contents are placed. It is either
// mDecor itself,or a child of mDecor where the contents go.
private ViewGroup mContentParent;
......

private LayoutInflater mLayoutInflater;
......

public PhoneWindow(Context context) {
super(context);
mLayoutInflater = LayoutInflater.from(context);
}

......
}

       这个函数定义在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。

       PhoneWindow类的构造函数很简单,它首先调用父类Window的构造函数来执行一些初始化操作,接着再调用LayoutInflater的静态成员函数from创建一个LayoutInflater实例,并且保存在成员变量mLayoutInflater中。这样,PhoneWindow类以后就可以通过成员变量mLayoutInflater来创建应用程序窗口的视图,这个视图使用类型为DecorView的成员变量mDecor来描述。PhoneWindow类还有另外一个类型为ViewGroup的成员变量mContentParent,用来描述一个视图容器,这个容器存放的就是成员变量mDecor所描述的视图的内容,不过这个容器也有可能指向的是mDecor本身。在后面的文章中,我们再详细分析类型为PhoneWindow的应用程序窗口的视图的创建过程。

      Window的构造函数定义在文件frameworks/base/core/java/android/view/Window.java中,它的实现很简单,只是初始化了其成员变量mContext,如下所示:

复制代码 代码如下:

public abstract class Window {
......

private final Context mContext;
......

public Window(Context context) {
mContext = context;
}

......
}

       从前面的调用过程可以知道,参数context描述的是正在启动的Activity组件,将它保存在Window类的成员变量mContext之后,Window类就可以通过它来访问与Activity组件相关的资源了。

       这一步执行完成之后,回到前面的Step 1中,即Activity类的成员函数attach中,接下来就会继续调用前面所创建的PhoneWindow对象从父类Window继承下来的成员函数setCallback来设置窗口回调接口,因此,接下来我们就继续分析Window类的成员函数setCallback的实现。

       Step 5. Window.setCallback

复制代码 代码如下:
public abstract class Window {
......

private Callback mCallback;
......

/**
* Set the Callback interface for this window,used to intercept key
* events and other dynamic operations in the window.
*
* @param callback The desired Callback interface.
*/
public void setCallback(Callback callback) {
mCallback = callback;
}

......
}
        这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。

        正在启动的Activity组件会将它所实现的一个Callback接口设置到与它所关联的一个PhoneWindow对象的父类Window的成员变量mCallback中去,这样当这个PhoneWindow对象接收到系统给它分发的IO输入事件,例如,键盘和触摸屏事件,转发给与它所关联的Activity组件处理,这一点可以参考前面Android应用程序键盘(Keyboard)消息处理机制分析一文。

        这一步执行完成之后,回到前面的Step 1中,即Activity类的成员函数attach中,接下来就会继续调用前面所创建的PhoneWindow对象从父类Window继承下来的成员函数setSoftInputMode来设置应用程序窗口的软键盘输入区域的显示模式,因此,接下来我们就继续分析Window类的成员函数setSoftInputMode的实现。

        Step 6. Window.setSoftInputMode

复制代码 代码如下:

public abstract class Window {
......

private boolean mHasSoftInputMode = false;
......

public void setSoftInputMode(int mode) {
final WindowManager.LayoutParams attrs = getAttributes();
if (mode != WindowManager.LayoutParams.soFT_INPUT_STATE_UNSPECIFIED) {
attrs.softInputMode = mode;
mHasSoftInputMode = true;
} else {
mHasSoftInputMode = false;
}
if (mCallback != null) {
mCallback.onWindowAttributesChanged(attrs);
}
}

......
}

       这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。

       参数mode有SOFT_INPUT_STATE_UNSPECIFIED、SOFT_INPUT_STATE_UNCHANGED、SOFT_INPUT_STATE_HIDDEN、SOFT_INPUT_STATE_ALWAYS_HIDDEN、SOFT_INPUT_STATE_VISIBLE和SOFT_INPUT_STATE_ALWAYS_VISIBLE一共六个取值,用来描述窗口的软键盘输入区域的显示模式,它们的含义如下所示:

      1. SOFT_INPUT_STATE_UNSPECIFIED:没有指定软键盘输入区域的显示状态。

      2. SOFT_INPUT_STATE_UNCHANGED:不要改变软键盘输入区域的显示状态。

      3. SOFT_INPUT_STATE_HIDDEN:在合适的时候隐藏软键盘输入区域,例如,当用户导航到当前窗口时。

      4. SOFT_INPUT_STATE_ALWAYS_HIDDEN:当窗口获得焦点时,总是隐藏软键盘输入区域。

      5. SOFT_INPUT_STATE_VISIBLE:在合适的时候显示软键盘输入区域,例如,当用户导航到当前窗口时。

      6. SOFT_INPUT_STATE_ALWAYS_VISIBLE:当窗口获得焦点时,总是显示软键盘输入区域。

      当参数mode的值不等于SOFT_INPUT_STATE_UNSPECIFIED时,就表示当前窗口被指定软键盘输入区域的显示模式,这时候Window类的成员函数setSoftInputMode就会将成员变量mHasSoftInputMode的值设置为true,并且将这个显示模式保存在用来描述窗口布局属性的一个WindowManager.LayoutParams对象的成员变量softInputMode中,否则的话,就会将成员变量mHasSoftInputMode的值设置为false。

      设置完成窗口的软键盘输入区域的显示模式之后,如果Window类的成员变量mCallback指向了一个窗口回调接口,那么Window类的成员函数setSoftInputMode还会调用它的成员函数onWindowAttributesChanged来通知与窗口所关联的Activity组件,它的窗口布局属性发生了变化。

       这一步执行完成之后,回到前面的Step 1中,即Activity类的成员函数attach中,接下来就会继续调用前面所创建的PhoneWindow对象从父类Window继承下来的成员函数setwindowManager来设置应用程序窗口的本地窗口管理器,因此,接下来我们就继续分析Window类的成员函数setwindowManager的实现。

       Step 7. Window.setwindowManager

复制代码 代码如下:

public abstract class Window {
......

private WindowManager mWindowManager;
private IBinder mAppToken;
private String mAppName;
......

public void setwindowManager(WindowManager wm,
IBinder appToken,String appName) {
mAppToken = appToken;
mAppName = appName;
if (wm == null) {
wm = WindowManagerImpl.getDefault();
}
mWindowManager = new LocalWindowManager(wm);
}

......
}

       这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。

       参数appToken用来描述当前正在处理的窗口是与哪一个Activity组件关联的,它是一个Binder代理对象,引用了在ActivityManagerService这一侧所创建的一个类型为ActivityRecord的Binder本地对象。从前面Android应用程序的Activity启动过程简要介绍和学习计划一系列文章可以知道,每一个启动起来了的Activity组件在ActivityManagerService这一侧,都有一个对应的ActivityRecord对象,用来描述该Activity组件的运行状态。这个Binder代理对象会被保存在Window类的成员变量mAppToken中,这样当前正在处理的窗口就可以知道与它所关联的Activity组件是什么。

       参数appName用来描述当前正在处理的窗口所关联的Activity组件的名称,这个名称会被保存在Window类的成员变量mAppName中。

       参数wm用来描述一个窗口管理器。从前面的调用过程可以知道, 这里传进来的参数wm的值等于null,因此,函数首先会调用WindowManagerImpl类的静态成员函数getDefault来获得一个默认的窗口管理器。有了这个窗口管理器之后,函数接着再使用它来创建一个本地窗口管理器,即一个LocalWindowManager对象,用来维护当前正在处理的应用程序窗口。

       接下来,我们首先分析WindowManagerImpl类的静态成员函数getDefault的实现,接着再分析本地窗口管理器的创建过程,即LocalWindowManager类的构造函数的实现。

       Step 8. WindowManagerImpl.getDefault

复制代码 代码如下:

public class WindowManagerImpl implements WindowManager {
......

public static WindowManagerImpl getDefault()
{
return mWindowManager;
}

......

private static WindowManagerImpl mWindowManager = new WindowManagerImpl();
}

       这个函数定义在文件frameworks/base/core/java/android/view/WindowManagerImpl.java中。

       WindowManagerImpl类的静态成员函数getDefault的实现很简单,它只是将静态成员变量mWindowManager所指向的一个WindowManagerImpl对象返回给调用者,这个WindowManagerImpl对象实现了WindowManager接口,因此,它就可以用来管理应用程序窗口。

      这一步执行完成之后,回到前面的Step 7中,即Window类的成员函数setwindowManager中,接下来就会使用前面所获得一个WindowManagerImpl对象来创建一个本地窗口管理器,即一个LocalWindowManager对象。

      Step 9. new LocalWindowManager

复制代码 代码如下:

public abstract class Window {
......

private final Context mContext;
......

private class LocalWindowManager implements WindowManager {
LocalWindowManager(WindowManager wm) {
mWindowManager = wm;
mDefaultdisplay = mContext.getResources().getDefaultdisplay(
mWindowManager.getDefaultdisplay());
}

......

private final WindowManager mWindowManager;

private final display mDefaultdisplay;
}

......
}

       这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。

       LocalWindowManager类的构造函数首先将参数wm所描述的一个WindowManagerImpl对象保存它的成员变量mWindowManager中,这样以后就将窗口管理工作交给它来处理。

       LocalWindowManager类的构造函数接着又通过成员变量mWindowManager所描述的一个WindowManagerImpl对象的成员函数getDefaultdisplay来获得一个display对象,用来描述系统屏幕属性。

       由于前面所获得的display对象描述的是全局的屏幕属性,而当前正在处理的窗口可能配置了一些可自定义的屏幕属性,因此,LocalWindowManager类的构造函数需要进一步地调整前面所获得的display对象所描述的屏幕属性,以便可以适合当前正在处理的窗口使用。LocalWindowManager类的构造函数首先通过外部类Window的成员变量mContext的成员函数getResources来获得一个Resources对象,接着再调用这个Resources对象的成员函数getDefaultdisplay来调整前面所获得的display对象所描述的屏幕属性。最终调整完成的display对象就保存在LocalWindowManager类的成员变量mDefaultdisplay中。

       从前面的Step 4可以知道,类Window的成员变量mContext描述的是与当前窗口所关联的一个Activity组件。Activity类的成员函数getResources是从父类Contextwrapper继续下来的,它实现在文件frameworks/base/core/java/android/content/Contextwrapper.java中,如下所示:

复制代码 代码如下:

public class Contextwrapper extends Context {
Context mBase;
......

@Override
public Resources getResources()
{
return mBase.getResources();
}

......
}

       从前面Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文可以知道,Contextwrapper类的成员变量mBase指向的是一个ContextImpl对象,用来描述一个Activity组件的运行上下文环境。通过调用这个ContextImpl对象的成员函数getResources,就可以获得与一个Resources对象,而通过这个Resources对象,就可以访问一个Activity组件的资源信息,从而可以获得它所配置的屏幕属性。

       至此,我们就分析完成一个Activity组件所关联的应用程序窗口对象的创建过程了。从分析的过程可以知道:

      1. 一个Activity组件所关联的应用程序窗口对象的类型为PhoneWindow。

      2. 这个类型为PhoneWindow的应用程序窗口是通过一个类型为LocalWindowManager的本地窗口管理器来维护的。

      3. 这个类型为LocalWindowManager的本地窗口管理器又是通过一个类型为WindowManagerImpl的窗口管理器来维护应用程序窗口的。

      4. 这个类型为PhoneWindow的应用程序窗口内部有一个类型为DecorView的视图对象,这个视图对象才是真正用来描述一个Activity组件的UI的。

      在接下来的一篇文章中,我们将继续分析应用程序窗口内部的视图对象的创建过程,敬请关注!

Autosizer应用程序窗口控制工具

Autosizer应用程序窗口控制工具

Autosizer是一个系统辅助软件,窗口控制工具,它能指定程序窗口的大小位置置顶等,可以将窗口最大化,最小化,比如在需要截图的时候可以讲窗口设定大小640*480,然后用FSCapture捕捉活动窗口,在看视频的时候置顶播放器,虽然大部分播放器都具有置顶功能,但是Autosizer是可以将word置顶哦。

Autosizer应用程序窗口控制工具

打开软件,所有当前窗口出现在上面列表中,选中需要调节的窗口程序名称,点击AutoSize出现设置窗口。

Autosizer应用程序窗口控制工具

可以选择max、min或者Resize自定义需要的大小。

c – 如何将其他应用程序窗口置于正面而不激活它?

c – 如何将其他应用程序窗口置于正面而不激活它?

我想把一个窗口(从其他应用程序)带到前面.目前我正在使用:
::SetwindowPos(hwnd,GetForegroundWindow(),SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

它工作正常,但在一些(我不知道)的情况下,它使窗口始终在顶部.根据MSDN,我应该在GetForegroundWindow()的位置使用HWND_NOTOPMOST但它不起作用 – 窗口停留在其他(不总是在顶部)窗口下.

如何在不激活前面的情况下将窗户拉到前面?

解决方法

另一个应用程序的窗口可以暂时“最顶层”将其置于前面而不激活它,首先在SetwindowPos调用中将HWND_TOPMOST指定为’hWndInsertAfter’,然后在第二个调用中指定HWND_NOTOPMOST(两个调用都使用SWP_NOOPTIVATE’ uFlags’).如果由于操作而有可能删除已经是最顶层的窗口的最顶层样式,则可以事先通过调用getwindowlong [Ptr]来测试WS_EX_TOPMOST ex-style.

如果有一个特定的窗口,其他应用程序的窗口需要在前面(而不是在所有窗口的前面),那么该窗口的所有者可以再次临时设置到它需要在前面的窗口.具有GWL_HWNDPARENT的getwindowlong [Ptr]可用于存储窗口的原始所有者,然后调用SetwindowLong [Ptr]来设置临时所有者,然后使用HWND_TOP调用SetwindowPos,然后再次使用SetwindowLong [Ptr]恢复原始所有者].

c# – 屏幕抓取应用程序窗口并与鼠标和键盘进行交互

c# – 屏幕抓取应用程序窗口并与鼠标和键盘进行交互

有一天,我发现自己沉迷于Flash游戏,同时对这件事感到沮丧.在对游戏感到沮丧的一刻,我以为我会为我打败一个“机器人”.嗯,我真的不会,但是让我意识到:我不知道如何与另一个应用程序进行交互.这带给我这个问题,一个人如何拍摄另一个正在运行的应用程序的屏幕截图,并与键盘和鼠标进行交互.理想情况下,解决方案将采用像c#这样的管理语言.

当做背景阅读网时,淹没了关于刮HTML的文章.实际上屏幕上刮刮应用程序的文章并不多.

不同的答案是值得赞赏的,因为我真的在考察什么是在那里.

UPDATE

我正在寻找一种方法来与另一个应用程序接口,而不是脚本/宏另一个应用程序.

UPDATE

可以使用Xming来重定向界面吗? http://www.straightrunning.com/XmingNotes/

也许终端服务客户端?
http://www.codeproject.com/KB/cs/RemoteDesktop_CSharpNET.aspx

解决方法

看看西库里,这基本上是你要找的.但是它是用Java编写的.

http://groups.csail.mit.edu/uid/sikuli/

关于应用程序窗口的 DCV NICE 强制框架更新windows应用程序框架的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android应用程序窗口(Activity)窗口对象(Window)创建指南、Autosizer应用程序窗口控制工具、c – 如何将其他应用程序窗口置于正面而不激活它?、c# – 屏幕抓取应用程序窗口并与鼠标和键盘进行交互的相关知识,请在本站寻找。

本文标签: