精华内容
下载资源
问答
  • c# winform AForge调用视频 录制视频 拍照 及logn4的简单用法(附源代码)
    2019-10-16 10:30:00

    项目代码地址:https://gitee.com/LIALL/aforge_video_recording.git    

    废话就不说了直接上手,展示图如下:

     

     

     

     

     

    1.引用AForge组件,

    nuget 方式 引用如下组件

     

     

     

     视频写入引入

     

     

    偷懒的话 可以将debug下的aforge组件复制过去引用,部分代码如下:

    private void Form1_Load(object sender, EventArgs e)
    {
    GraphicsPath gp = new GraphicsPath();
    Rectangle rectg = new Rectangle( new Point( this.GbxVideo.Location.X, this.GbxVideo.Location.Y), new Size(GbxVideo.Width-50, GbxVideo.Height-50));
    gp.AddEllipse(rectg);
    GbxVideo.Region = new Region(gp);


    videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    if (videoDevices.Count == 0) {
    MessageBox.Show("请连接视频!","提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    return;
    }
    if (videoDevices.Count > 0) {

    for (int n = 0; n < videoDevices.Count; n++) {
    ComboxVideo.Items.Add(videoDevices[0].Name);
    }
    }
    ComboxVideo.Text = videoDevices[0].Name;
    ComBoxframe.SelectedText = "20";

    }
    VideoCaptureDevice _videoCaptureDevice;
    public void StartCameras() {

    _videoCaptureDevice = new VideoCaptureDevice(videoDevices[0].MonikerString)
    {
    DesiredFrameSize = new Size(320, 240),//可做页面设置
    DesiredFrameRate = 20


    };
    videoSourcePlayer1.VideoSource = _videoCaptureDevice;
    videoSourcePlayer1.Start();

    timervideo.Enabled = true;
    }
    Thread _mythread;
    private void btnstartCameras_Click(object sender, EventArgs e)
    {
    try
    {
    btnstartCameras.Enabled = false;
    btnstopCameras.Enabled = true;
    StartCameras();
    LogHelper.WriteLog(typeof(Form1), "开始录制视频");
    string path = Application.StartupPath + "\\Video";
    if (!File.Exists(path))
    {

    Directory.CreateDirectory(path);
    }
    string VideoPath = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ff") + "_sp_.avi";
    writer = new AVIWriter();
    writer.Open(VideoPath, 320, 240); //可设置
    _mythread = new Thread(new ThreadStart(TestStart1));
    _mythread.Start();
    }
    catch (Exception ex) {
    LogHelper.WriteLogError(typeof(Form1), ex);
    }
    }
    public void TestStart() {

    MicroTimer _microTimer = new MicroTimer();
    _microTimer.MicroTimerElapsed += new MicroTimer.MicroTimerElapsedEventHandler(OnTimedEvent1);
    _microTimer.Interval = 49000;
    _microTimer.Enabled = true;
    // Thread.Sleep(15000); //录制时间为15秒
    _microTimer.Enabled = false;
    }
    MicroTimer _microTimer = new MicroTimer();
    public void TestStart1()
    {

    // MicroTimer _microTimer = new MicroTimer();
    _microTimer.MicroTimerElapsed += new MicroTimer.MicroTimerElapsedEventHandler(OnTimedEvent1);
    _microTimer.Interval = 49000;
    _microTimer.Enabled = true;

    }
    Bitmap bmp1 = null;

    private void OnTimedEvent1(object sender, MicroTimerEventArgs timerEventArgs)
    {
    try
    {
    writer.AddFrame(bmp1);
    }
    catch (Exception ex)
    {

    LogHelper.WriteLogError(typeof(Form1), ex);
    }
    }

    private void btnstopCameras_Click(object sender, EventArgs e)
    {
    if (videoSourcePlayer1.IsRunning) {
    if (_mythread.IsAlive) _mythread.Abort();

    timervideo.Enabled = false;
    _microTimer.Enabled = false;
    videoSourcePlayer1.SignalToStop();
    videoSourcePlayer1.WaitForStop();
    writer.Close();
    writer.Dispose();

    btnstartCameras.Enabled= true;
    btnstopCameras.Enabled = false;
    }

    }

    private void btnexit_Click(object sender, EventArgs e)
    {
    if (videoSourcePlayer1.IsRunning)
    {
    MessageBox.Show("请先停止录制视频","提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
    }
    this.Dispose();

     

    更多相关内容
  • winform录制声音工具

    2017-08-08 13:07:21
    Winform程序,打开开始录制,关闭停止录制
  • 这是一个用qtp录制的脚本,每一个Action对应一个测试用例。 包括数据驱动,action调用,低级录制,场景恢复,功能键测试,检查点测试,正则表达式运用等。
  • pudn上下载的一个C#桌面屏幕录制的代码,此代码使用了WMEncoder解码器。vs2010打开能够完美顺利运行。
  • C# 程序使用AForge.Video.FFMPEG 基于.Net framework V4.0 录制视频需要的关联类库。
  • QTP问题记录

    2016-12-04 16:16:43
    1.QTP录制或回放CS客户端时,总是容易导致测试客户端程序崩溃 有可能是插件冲突,建议打开qtp时尽可能的少选或者不选不用的插件,例如activex插件。   2.有时候当运行测试脚本时,有些功能加载会比较慢,QTP会...

    1.QTP录制或回放CS客户端时,总是容易导致测试客户端程序崩溃

    有可能是插件冲突,建议打开qtp时尽可能的少选或者不选不用的插件例如activex插件。

     

    2.有时候当运行测试脚本时,有些功能加载会比较慢,QTP会直接弹出找不到对象的错误,或者在运行脚本时你希望查看当前运行的内容,这时可以使用wait函数设置等待时间,如:

    设定等待时长为10秒  Wait(10),还可以设置每个步骤执行前停顿1s



    3.测试验证时候经常会设置一些弹窗提示,登录成功这样的等等,但是msgbox弹窗有个麻烦就是需要手动点了确定后,脚本才能够继续执行,可以改用下面的方式,弹窗后自动到设置时间自动关闭

    Dim res, WSH
    Set WSH = CreateObject("WScript.Shell")
    res = WSH.Popup("Closed after 2 seconds.", 2)  '代替msgbox "Closed after 2 seconds"
    Set WSH = Nothing

     

    4.录制完的脚本,有的对象是QTP自己命名的,可以在对象库中手动修改名称,方便以后查看脚本时能够马上理解,不用担心,修改名称不会影响对象的属性导致回放不识别的。


    5.录制无法正确或成功获取对象时,可以通过object spy来选择对象,然后添加到对象库中。如果用object spy也不好选择对象时(如界面控件太多,选择时总是会自动跳到其他的控件上导致对象选择失败),可以尽量将界面窗口移开,不保持窗口重叠,这样可以减少干扰。

     

    6.录制时候如果软件出现崩溃现象(测试软件容易出现未处理异常然后崩溃关闭),建议不采用录制,直接自己编写脚本,然后将需要使用到的对象添加到对象库中,照样可以正常回放。最好是多种方式结合,比如能识别对象的时候就用object spy添加对象,不能识别的时候就录制当前步骤即可。

     

    7.录制完了后回放正常,但是过来两天再次回放失败

    导致问题原因:当天为了测试web项目,更新了两个插件,一个是QTP支持IE11的,一个是QTP支持google浏览器的,更新了后再去跑之前录制的CS项目脚本,就会有以上提示,此时重新去录制也会无法识别wpf对象

    解决方法:卸载,重新安装,不再更新以上的两个插件,再执行之前的脚本,正常回放,打算以后只用QTP来测试cs项目了,web的用新工具selenium。

     

    8.回放过程中提示Cannot identify the object,通过object spy重新抓取对象,发现hwnd这个值每次会变化的,但是之前却将他添加到了属性值中,所以导致对象验证不通过,在属性列表中将该项删除掉即可。



    9.编写完一段脚本后,不想每次都从头还是run的话,可以将鼠标放在要验证的步骤,选择run from step从当前步骤运行,会省时很多


     

    10.创建多个action,在菜单找了很久没有找到,百度才知道是这个紫色小方块



    11.测试准备中会录制一些测试的数据,看看能不能够录制回放成功,但是每次运行完都会自动弹出result窗口,而且电脑总会卡住一会,可以在tool-option-run界面取消勾选view results when run session ends就可以了。如果想查看result时,直接点击automation-results即可。



    展开全文
  • 我的操作系统是Win7旗舰版,安装了LoadRunner11,安装过程可参考这篇文章: ...现使用VS2012建立了Windows窗体应用程序,里面放置了一个WebBrowser控件,URL设置为www...

    我的操作系统是Win7旗舰版,安装了LoadRunner11,安装过程可参考这篇文章:

    http://my.oschina.net/Tsybius2014/blog/704949

    现使用VS2012建立了Windows窗体应用程序,里面放置了一个WebBrowser控件,URL设置为www.baidu.com

    使用LoadRunner11录制该程序的脚本时,将 Program to record 配置成该Winform应用程序即可:

    点击OK按钮就可以开始录制了,可以发现在操作程序时event数一直在增长

    录制完毕后,可以观察到录制好的脚本


    再说一件比较坑爹的事情,有的时候用LoadRunner11运行Winform程序,运行后Winform程序会直接崩溃。

    问题事件名称通常为BEX,故障模块是StackHash_0a9e。这个问题我上网查了些资料,发现是因为该程序在“数据执行保护”下运行的缘故。

    如果在任务管理器中添加列“数据执行保护”,就可以看到当前的应用程序是否启用了数据执行保护功能(英文简称DEP)。

    如果exe程序开启了DEP,那么很有可能用LoadRunner11打开时程序会崩溃,这时候需要在系统属性的性能选项中不启用DEP的程序列表中添加此程序。

    但很多程序被要求必须在启用DEP的情况下运行,鲁莽添加会直接报错。

    为此可以使用VS开发人员命令提示中的 editbin.exe ,用法是:

    editbin.exe /NXCOMPAT:NO EXE文件路径

    执行效果如下:

    使用 editbin.exe 处理后,该程序就可以添加到DEP的特例中了。

    最后补充一下:个人认为使用LoadRunner11运行Winform程序并不是进行性能测试的明智之选。本文只是记录了下我的学习过程,如果要对后台服务进行性能测试,还是直接用浏览器比较靠谱。

    END

    转载于:https://my.oschina.net/Tsybius2014/blog/705948

    展开全文
  • 2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示 3.可在预览点开之后进行拍照,也可边录制视频边拍照 4.添加了视频和...
  • 基于.NETFramework2.0编写,winform程序。支持摄像头采集,录制屏幕,声卡采集,麦克风话筒采集,并且可以对采集到的声音混音。直接返回Bitmap图片以及原始声音数据,以便进一步加工,比如保存为音频文件,或者编码...
  • c# winform快捷键实现

    2019-10-02 08:07:32
    我们在软件中经常用到快捷键,这里整理备份一下。 首先我们要定义可以作为快捷键的按键,以下是整理的 一些,自己可以根据情况来修改 public static Dictionary<int, string> HotKeys = new Dictionary...

    我们在软件中经常用到快捷键,这里整理备份一下。

    首先我们要定义可以作为快捷键的按键,以下是整理的 一些,自己可以根据情况来修改

      public static Dictionary<int, string> HotKeys = new Dictionary<int, string>() 
            { 
                {48,"0"},  
                {49,"1"},  
                {50,"2"},      
                {51,"3"},     
                {52,"4"},    
                {53,"5"},     
                {54,"6"},    
                {55,"7"},    
                {56,"8"},    
                {57,"9"},
                {65,"A"},   
                {66,"B"},     
                {67,"C"},    
                {68,"D"},      
                {69,"E"},     
                {70,"F"},    
                {71,"G"},    
                {72,"H"},     
                {73,"I"},    
                {74,"J"},    
                {75,"K"},     
                {76,"L"},     
                {77,"M"},    
                {78,"N"},   
                {79,"O"},   
                {80,"P"},    
                {81,"Q"},     
                {82,"R"},     
                {83,"S"},      
                {84,"T"},     
                {85,"U"},     
                {86,"V"},    
                {87,"W"},     
                {88,"X"},      
                {89,"Y"},    
                {90,"Z"},        
                {112,"F1"},  
                {113,"F2"},     
                {114,"F3"},     
                {115,"F4"},    
                {116,"F5"},   
                {117,"F6"},     
                {118,"F7"},    
                {119,"F8"},     
                {120,"F9"},     
                {121,"F10"},   
                {122,"F11"},    
                {123,"F12"},
                {33,"PageUp"}, 
                {34,"PageDown"},  
                {35,"End"},      
                {36,"Home"},   
                {37,""},     
                {38,""},   
                {39,""},   
                {40,""},    
                {45,"Insert"},
                {46,"Delete"},
                {186,";"},   
                {187,"="},   
                {188,","},   
                {189,"-"},    
                {190,"."},    
                {191,"/"},    
                {192,"`"},   
                {219,"["},     
                {220,"\\"},    
                {221,"]"}
            };
    View Code

    然后弄个数据表存一下定义功能对应的快捷键,表结构如下

    CREATE TABLE [dbo].[HotKey](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [FrmName] [nvarchar](50) NULL,
        [Sort] [int] NULL,
        [ActionName] [nvarchar](50) NULL,
        [ActionKey] [nvarchar](50) NULL,
        [KeyValue] [nvarchar](50) NULL
    ) ON [PRIMARY]
    
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'界面' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'FrmName'
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'顺序' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'Sort'
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionName'
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能编码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionKey'
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'热键' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'KeyValue'
    GO
    View Code

    系统启动的时候缓存一下设置的快捷键 

    public static List<HotKey> HotKeySetting { get; set; }

    基类窗体里面写窗体的

    写KeyUP  和KeyDown事件

     bool m_blnCtrl = false;
     bool m_blnAlt = false;
     bool m_blnShift = false;
    
            [Description("定义的热键列表"), Category("自定义")]
            public Dictionary<int, string> HotKeys { get; set; }
            //如果事件返回true则表示已经找到了快捷键事件,则不再向下传递
            public delegate bool HotKeyEventHandler(string strHotKey);
            /// <summary>
            /// 热键事件
            /// </summary>
            [Description("热键事件"), Category("自定义")]
            public event HotKeyEventHandler HotKeyDown;
    
    
     protected void FrmBase_KeyUp(object sender, KeyEventArgs e)
            {
                if (HotKeyDown != null && HotKeys != null)
                {
                    if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
                        m_blnCtrl = false;
                    if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
                        m_blnAlt = false;
                    if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
                        m_blnShift = false;
                }
            }
    
            protected void FrmBase_KeyDown(object sender, KeyEventArgs e)
            {
                if (HotKeyDown != null && HotKeys != null)
                {
                    if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
                        m_blnCtrl = true;
                    if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
                        m_blnAlt = true;
                    if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
                        m_blnShift = true;
                    if (HotKeys.ContainsKey(e.KeyValue))
                    {
                        string strKey = string.Empty;
                        if (m_blnCtrl)
                        {
                            strKey += "Ctrl+";
                        }
                        if (m_blnAlt)
                        {
                            strKey += "Alt+";
                        }
                        if (m_blnShift)
                        {
                            strKey += "Shift+";
                        }
                        strKey += HotKeys[e.KeyValue];
    
                        if (HotKeyDown(strKey))
                        {
                            e.Handled = true;
                            e.SuppressKeyPress = true;
                        }
                    }
                }
            }            
    View Code

    你会注意到keyup和kedown事件的修饰符是protected,为什么要用protected呢?是因为窗体的一些输入控件的按键事件是不会传递到窗体的,比如textbox这些,所有需要手动指定一下

    子窗体中注册事件就可以了,如果你没有用基类窗体,那么直接写在一起就可以了

    this.HotKeys = HotKeys;
                this.HotKeyDown += FrmMain_HotKeyDown;
                //将输入框的2个事件指向窗体的2个事件
                this.txtSearch.KeyDown += this.FrmBase_KeyDown;
                this.txtSearch.KeyUp += this.FrmBase_KeyUp;
    
    /// <summary>
            /// 热键按下事件
            /// </summary>
            /// <param name="strHotKey">热键值</param>
            /// <returns>当返回true则表示不再向下传递按键事件,通常当匹配到热键操作后返回true</returns>
            bool FrmMain_HotKeyDown(string strHotKey)
            {
                Console.WriteLine(strHotKey);
                string strHotAction = GetHotKeyAction("FrmMain", strHotKey);
                if (string.IsNullOrEmpty(strHotAction))
                    return false;
                else
                {
                    //这里根据返回的功能名称做操作就可以了
                    return true;
                }
            }
    
    
    public static string GetHotKeyAction(string strFrom, string strHotKey)
            {
                var entity = HotKeySetting.Find(p => p.FrmName.ToLower() == strFrom.ToLower() && p.KeyValue.ToStringExt().ToLower() == strHotKey.ToLower());
                if (entity != null)
                    return entity.ActionKey;
                else
                    return string.Empty;
            }
    View Code

    这样就可以了

    转载于:https://www.cnblogs.com/bfyx/p/10528399.html

    展开全文
  • wpf与winform结合特效

    2021-05-27 20:17:45
    假如您都还没机遇探索。...NETCore上运行一个十分历史悠久的WPF应用程序时的一切别的大会或视频录制。我看了一个演试,他在。NETCore上运行BabySmash。 文件:590m.com/f/25127180-497362319-e2def6(访
  • 如果你的C#(Winform)程序无法使用Windows Media Player 组件播放视频文件(一旦点击播放立马程序闪退,但可以播放音频文件),请按照下面图例设置) 1.桌面右击鼠标找到 独立显卡的控制面板(目的为切换显卡使用) ...
  • 本系统属于小型的家庭视频监控系统,可以对指定的区域进行适时监控。本系统主要实现以下目标。... 选择观看已经录制的视频的文件。  晚上的系统注册功能。  系统最大限度地实现了易维护性和易操作性。
  • C# 屏幕录制代码

    2014-02-08 20:41:27
    这是用C#写的一个屏幕录制程序代码,程序运行必须要安装WMEncoder解码器,下载后的包中已经包含有WMEncoder,点击安装即可,有可能会缺少configbak.prx文件,如缺少直接将其configbak.prx考入WMEncoder的安装目录...
  • 在Unity(C#)中使用FFMPEG录制屏幕

    千次阅读 热门讨论 2018-06-01 14:55:31
    在Unity(C#)中使用FFMPEG录制屏幕 参考文献: ... 在Unity中通过C#代码调用FFMPEG简单地实现了录制Windows屏幕的功能,顺便解决了每次录制后如果不退出程序就不能再次正常...
  • C# 窗口程序闪退

    2020-12-20 04:19:42
    问题描述:最初在弄开机启动时发现问题时程序启动后闪退后来将程序拖动到cmd窗口时在不同的目录下执行时:在程序当前目录下执行闪退在其他目录下执行部闪退解决方案:通过不断的注释部分代码取消注释部分代码调试的方式...
  • 使用C#编写的录音机程序,通过NAudio实现对本机播放声音的录制播放功能。 程序可以录制本机输出的音频信息,并能通过文件、MemoryStream内存流两种方式对录制的音频进行播放。
  • Winform + NAudio + Spectrogram 实现音频时域图形 先看效果 Spectrogram 是一个.NET库,用于根据预先录制的信号或声卡中的实时音频创建频谱图。Spectrogram 使用FftSharp项目提供的FFT算法和窗口函数,并且以.NET ...
  • 使用ffmpeg调用摄像头录制视频(C#)

    千次阅读 2020-05-28 15:09:27
    本文通过往cmd控制台输入命令的方式实现视频的录制,具体的命令可以参考文章https://blog.csdn.net/zhoubotong2012/article/details/79338093的1前半部分 步骤: 1 下载ffmpeg.exe工具(一定要看准位数,本机测试...
  • 录制这堂课程的目的就是专门给想学习和了解WinForm应用程序实战开发的童鞋们。虽然当前主流的架构开发的确大多是WEB端和App移动端开发,可能大家都忽略了传统的WinForm桌面应用程序开发的魅力! 1.1、本次...
  • WinForm企业级C/S框架实战项目演练

    千次阅读 2018-02-28 16:44:09
    录制这堂课程的目的就是专门给想学习和了解WinForm应用程序的童鞋们。虽然当前主流的架构开发的确大多是WEB端和App移动端开发,可能大家都忽略了传统的WinForm桌面应用程序开发的魅力!如果您对本次分享《 WinFo...
  • C#实现声音录制

    2008-03-07 22:22:31
    用c#实现的声音录制程序,只是一个示例代码,可以做参考
  • 用 .NET / C# 开发一个录屏小程序 实现思路: 不断的获取桌面屏幕的图像,每一张图像我们称为 一帧 。 这里介绍一下 帧率 (FPS , Frame per Second) 的概念:每秒显示的帧数。 人类视觉系统每秒可处理10到12张图像并...
  • 这个例子是基于sharpcapture开发的winform程序。提供源码。SharpCapture是一款音视频数据采集类库。它完全采用C#语言开发,基于DirectShow技术实现摄像头帧画面采集、屏幕录制、声卡采集、麦克风采集、混音等诸多...
  • WinForm 快捷键设置

    千次阅读 2011-12-05 11:39:34
    1、Alt+*(按钮快捷键) 按钮快捷键也为最常用快捷键,其设置也故为简单。在大家给button、label、menuStrip等其他控件的Text属性指定名称时,在其后面加上‘&’然后在加上一个指定字母即可。如:确定(&D),(Alt+D)...
  • 基于libVlc开发Winform视频播放器

    千次阅读 2017-09-30 10:01:36
    6、在退出程序的时候Vlc.DotNet库会清理相关资源,这时候会报异常,这里我增加了Release方法,可以提前调用以避免该异常的发生。 最后Stop停止播放视频的问题偶尔还是会出现的,特别是在FormClosing事件中,不...
  • C#实现屏幕录制

    万次阅读 2014-03-11 15:51:23
    以前写过两篇录制麦克风语音和摄像头视频的文章,最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?
  • C#(Winform)调用Excel中VBA宏 简介 最近做一个项目,因为数据分析部分使用VBA简单一些,但是又需要在界面中呈现出来,所以用VBA.C#,SQL相结合的方式完成了本次项目,下面简单的讲讲界面如何操作VBA宏吧 代码区 ///...
  • 录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了。在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足。下面按照软件的各部分分别做作总结:0. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 769
精华内容 307
关键字:

录制winform程序