搜索
bottom↓
回复: 408

题目:多功能按键设计。利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按。

  [复制链接]

出0入0汤圆

发表于 2011-8-23 19:19:45 | 显示全部楼层
回复【2楼】surf_131  
很有意义的帖子。
我这几天在pic平台上也考虑过同样的东西,但是今天放弃了三种不同键识别的办法,改用一长一短两个键实现需要的功能。是在定时中断中设置几个变量来识别长短键。这样,短键可以在抬键后一个中断周期内快速响应,长键则在按下后3秒左右才开始响应,并能用查询法等待上次长键结束。
如果允许的双击间隔是500ms,则判断单点击要滞后500ms以上,太迟钝了。
-----------------------------------------------------------------------

在windows平台上,鼠标双击事件的顺序大致为键按下、键抬起、双击键按下;这样不会出现单击滞后500ms的问题了。

出0入0汤圆

发表于 2011-8-25 21:57:04 | 显示全部楼层
回复【7楼】machao  
回复【5楼】ifree64
-----------------------------------------------------------------------
在windows平台上,鼠标双击事件的顺序大致为键按下、键抬起、双击键按下;这样不会出现单击滞后500ms的问题了。
-----------------------------------------------------------------------
你分析的不对。
在windows平台上,鼠标双击事件为左键快速按两下,之间还是有时间间隔定义的。单其定义不同:
我们以双击打开文件夹中一个word文件为例:
将鼠标运动指在这个文件上,然后单击,表示选中该文件,如果快速双击,则表示选中该文件,并打开。你可以测试一下,如果将鼠标运动指在这个文件上,然后单击,过长点时间再次单击,是不会打开文件的。
所以,此时wi......
-----------------------------------------------------------------------

不知马老师是否熟悉Windows平台上的程序开发,我的话是没有错误的,请看如下这句引自MSDN的原话
(http://msdn.microsoft.com/en-us/library/ms645606(v=vs.85).aspx)

Only windows that have the CS_DBLCLKS style can receive WM_LBUTTONDBLCLK messages, which the system generates whenever the user presses, releases, and again presses the left mouse button within the system's double-click time limit. Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP

这就是一个双击事件并不是只有一个WM_LBUTTONDBLCLK消息,而是按照先后顺序有4个消息;至于如何对这四个消息如何处理是应用程序自己的事。
如果只需要处理单击事件,响应WM_LBUTTONDOWN消息即可,要处理双击事件,就响应WM_LBUTTONDBLCLK,这样处理单击的事件的应用程序也不会
引入500ms的延迟,处理双击的也可得到这个双击事件。至于两次单击之间是多长的时间,这只是一个系统的参数而已。

出0入0汤圆

发表于 2011-8-26 00:03:05 | 显示全部楼层
回复【27楼】packer  
25楼的兄弟,你没理解马老师的意思
当你第一次单击之后,神仙也不知道这是单击还是双击
这时有2种处理方法
1、等待500ms(可调),这时就可判断是单击还是双击。马老师程序就是这么做的。
2、先按单击处理一次,如果在500ms(可调)内又一次单击,则继续执行双击。这时有个问题,如果单击和双击无关,那么第一次单击就是多余的,完全可以说是错误的。windows取了个巧,定义单击是选定,双击是打开,两个操作具有逻辑上的延续性,所以显得没有延时。
   如果你定义单击是删除,双击打开,你看看有没有延时。
-----------------------------------------------------------------------

你没有理解我的意思而已。

我并不是说马老师这样的做法是错误的,因为要判断双击必须要等待500ms(可调),但马老师现在这样的处理方法使得
对于一个需要单击事件的应用必须等到500ms以后才能有响应,这就是2楼兄弟说的500ms的延迟,太迟钝了。
当然,如果对于单击和双击同一个按键定义完全截然不同的功能这个500ms的延迟就是必须付出的代价了,不过我认为
这样的功能定义实在是太不人性化了,需要用户来学习适应并不是一个优秀的人机交互设计。

windows鼠标双击的事件机制不用于马老师这里的处理方式,马老师对于双击事件是吃掉了前面的单击,而windows是仍然将前面的
单击事件放到消息队列里面。

“单击--长时间--单击”动作序列在windows里是这样的消息: down、 up、 down、 up
“单击--短时间--单击”动作序列在windows里是这样的消息:down、up、double_down、up,马老师的方法是: double_down

出0入0汤圆

发表于 2011-8-26 08:54:21 | 显示全部楼层
回复【33楼】machao  

我在6楼已经给出了实际的东西:
    --------------------------------------------------------------------------------------------------------
    手机有吧。打开进入短信编辑状态,设置输入方式为英文,然后操作一个键单击、双击、长按,看屏幕输入有何变化。  
    但是你在打电话,输入电话号码的时候,此时只响应单击,和长按了。单击就是在释放后响应的。双击此时是两次单击。
    --------------------------------------------------------------------------------------------------------
     
    应该先去证明一下,而后再发表意见。如果你的手机没有按键键盘,那么也应该找一个体会一下。
-----------------------------------------------------------------------

状态机的思想我也是非常喜欢用的,并且很好用。

昨天发帖子时因为网络故障,关于人机交互这方面我的意思表达得并不全面,我的意思不是说使用单击和双击就是差的人机交互,而是如果一个按键的功能单击和双击风马牛不相及,甚至逻辑矛盾,那么就是差的人机交互设计。比如单击用于删除、双击打开,那么在需要打开文件、或者删除文件时,就必然会发生一些单击、双击的错误操作。而像windows的资源管理器那样对单击、双击的具有“逻辑延续性”的功能定义正正是需要认真学习的人机交互功能设计。

刚才也特意试了下我手中的山寨手机在英文输入下的按键处理,可能这个手机功能实在太山寨了,没有长按和双击的支持,也许其他手机有这样的功能吧。不过,我也仔细想了一下手机如何利用非常少的按键实现众多功能的,貌似问题的关键不是单击、双击、长按。而是“确定”、“取消”两个按键在不同时候有不同功能,通过“确定”、“取消”、“上”、“下”这几个功能键构成了一个菜单系统。是不是这种方式才是更好的利用少量按键实现多种功能的方法呢(这里也用一个状态机来规定不同状态下同一按键的功能)?当然适当的定义长按和双击可以带来更加灵活的变化,不过我比较反对对同一个键的不同按的方式定义“逻辑不相关”的功能。比如“+”键,单击加一次,长按加十次,按着不放再连_发“+”的功能,应该就是一种非常“直白"的功能定义,但如果把”+“键,单击定义为加,双击定义为减,恐怕就不是一个很好的功能第一。

PS:我前面关于windows对鼠标单击、双击的处理提到windows的消息机制,这个是windows系统很底层的驱动行为;不知为什么大家都用windows资源管理器的行为来讨论windows对鼠标单击、双击的处理。windows的鼠标驱动和windows资源管理器之间的关系正如马老师贴出来的按键驱动与上层应用之间的关系。

出0入0汤圆

发表于 2011-8-26 09:15:15 | 显示全部楼层
回复【33楼】machao  
   
W鼠标双击一个文件,包括2个动作:1-选中该文件,2-打开文件,单击一个文件的动作是选中该文件。由于双击的第1个动作与单击相同,所以其双击操作的第1次单击不需要等待,可以马上响应的。
   
  这个也简单呀。你写2套低层的驱动,一套就是扫描按键的按下,马上响应,另一套是需要等待的。然后增加一个状态判断,如果是上层在查询时间方式,那么使用前一套扫描按键,反映肯定快,如果上层在设置时间方式,就使用第2套扫描按键,此时单击响应要慢一点。这样不就平衡了吗?谁一天到晚去设置日期和时间?
-----------------------------------------------------------------------

请问马老师,如何用2套底层驱动切换的方式实现类似windows资源管理器对鼠标单双击功能呢?我觉得这个问题的答案才是windows鼠标驱动和您的方式在本质上的区别。

出0入0汤圆

发表于 2011-8-27 17:37:56 | 显示全部楼层
回复【43楼】machao  
回复【35楼】ifree64
-----------------------------------------------------------------------
1."刚才也特意试了下我手中的山寨手机在英文输入下的按键处理,可能这个手机功能实在太山寨了,没有长按和双击的支持......"

(原文件名:qq截图20110827133745.png)
   如果手机键盘如上,那么你如何直接使用键盘操作输入英文字母b或者c的?

-----------------------------------------------------------------------
我用的手机设定了一定的延时,在这个时间内可以在a、b、c三个字母间切换,但这不是双击也不是长按吧。


2。“请问马老师,如何用2套底层驱动切换的方式实现类似windows资源管理器对鼠标单双击功能呢?”
   要实现这个的方法我在33楼提示过。底层键盘扫描就是最基本的:利用状态机的方式,提供每次按键的down、up状态、本次down-up的间隔、上次up-本次dow......
-----------------------------------------------------------------------
我的意思是在您楼主位的代码中,识别到是双击时,“吃掉”了双击前的这个单击,就不好去做类似W里面的单、双击处理了,并且引入了单击识别的500ms延迟。而你的新方法看起来好像是要在按键函数中返回按键的down、up状态以及down、up间的间隔给上层,由上层来识别这个是单击还是双击,并作相关处理?为什么不考虑引入消息系统,类似与W那样来返回按键情况呢?

出0入0汤圆

发表于 2011-8-27 20:04:47 | 显示全部楼层
回复【45楼】packer  
你专业是不是在pc上搞开发,没接触过底层驱动啊,感觉你对windows很熟,但不理解马老师说的
osi分七层哪,上面讨论的都是最底层最基础的,消息系统已经属于上层了,不在本问题讨论范围。
-----------------------------------------------------------------------

难道windows的消息系统属于应用层?我第一次这么听说,系统底层关心的是检测硬件的输入,并且把它们放入消息队列;
应用层仅仅是从消息队列中取出消息,并且处理这个消息。

出0入0汤圆

发表于 2011-8-27 20:08:57 | 显示全部楼层
回复【49楼】packer  
楼上的,偷换概念没意思。“消息机制”和我们所说的”消息系统“是一个概念吗
我为什么特别强调7层协议,就是感觉44楼没理解马老师在43楼最后一句:
“有了这些,你的上层可以做各种的分析和处理。”
一个按键处理可以分解成好几层任务,本贴只讨论最最最最底层的,而44楼一直想把上层的任务加进来。
我替他着急
-----------------------------------------------------------------------

你可以将按键的处理分成多层,但真正的应用层希望看到的是一个简单一致的界面。应用层希望看到的是:
有没有单击?有没有双击?而不是还要自己根据时间间隔等来自己判断这个是单击还是双击。

出0入0汤圆

发表于 2011-8-27 23:32:44 | 显示全部楼层
回复【56楼】machao  

     ifree64还没有开窍,好象简单的认为“应用层”的下面就是最低层I/O了?
----------------------------------------------------------------------
对于是否“开窍”我表示一笑而过。

在我的观点中,我并没有认为应用层下面就是“最底层”I/O,这样的误解可能是这句话造成的:

2:“而你的新方法看起来好像是要在按键函数中返回按键的down、up状态以及down、up间的间隔给上层,由上层来识别这个是单击还是双击,并作相关处理?为什么不考虑引入消息系统,类似与W那样来返回按键情况呢?”

我的本意本来就是应该把这些诸如“单击”、“双击”的功能放到底层去做。只不过我们在对“底层”的理解上出现了一些概念上的差别。你把这些功能的实现代码称为“中间层”,而我统统的把它们认为是底层,如果要划分得这么细,那么每增加一级函数嵌套,就增加一层,就不知我的系统将有多少层了。在我看来,你处理双击的部分的"中间层“,是为上层服务的,那么在上层来看,它就是上层的底层。当然,其实我们没有必要执着于它是底层还是中间层这个称谓。

回到“单击延迟”这个话题来,我早就同意如果要把单击和双击同一个按键定义完全不同的功能,那么这个时候对单击的识别延迟是必然的。我只是以为

1、马老师这个中间层在识别双击时,在中间层“吃掉了”双击事件的前一个单击按键事件,因而在中间层就引入了单击的延迟这种做法不是特别恰当,可以学习Windows的事件处理机制来避免这个在中间层中引入的单击延迟。

2、如果对同一个按键的单击和双击功能定义得功能非常逻辑不相关是不人性化的。比如单击删除、双击打开文件;比如单击“加”、双击“减”;但关于人性化的问题是需要具体问题具体分析的,这个问题不能一概而论;这个人性化问题这里不讨论,这个问题太笼统(iPhone的应用程序开发甚至有一本专门的书来介绍人机交互设计,并且它成功的关键就是人机交互)。

对于第一点,就用手机的英文输入来讨论吧,要输入“AAA”,按照马老师前面的观点,这是类似于你双击的延时的例子。但请注意虽然输入第一个A需要等待一段时间后才能确认这个A,但从按下A到屏幕上看到这个A是即时而没有延时的,而你中间层的双击识别代码却是需要500ms延迟的,我想这个才是关键。如果你说为了实现这样的要求,需要不同的“中间层”,那么好了,这本来就是我的讨论的出发点。

------------
微软是聪明的公司,朝三暮四的方法,耍了一群猴子。
------
技术讨论没有必要涉及到这些“宗教”意义的话语吧。


PS:
写完后再看一下马老师最后的话,发现其实我们之间的观点并没有根本的分歧,只是因为论坛只言片语产生的一些误解。
你的方法,可以对单击、双击定义完全不同的功能,但引入必然的单击延迟;
MS的事件机制,如果要对单击、双击定义完全不同的功能,需要自己做类似的处理,但没有单击的延迟。窃以为,MS的方法更好一些。

出0入0汤圆

发表于 2011-8-28 07:38:40 | 显示全部楼层
回复【58楼】machao  
楼上的,你的帖子自己矛盾:
“回到“单击延迟”这个话题来,我早就同意如果要把单击和双击同一个按键定义完全不同的功能,那么这个时候对单击的识别延迟是必然的”
“ms的事件机制,如果要对单击、双击定义完全不同的功能,需要自己做类似的处理,但没有单击的延迟。窃以为,ms的方法更好一些”
==========
你已经定义了条件:“单击、双击定义完全不同的功能”!那么,当第一次单击后,任何系统都要等待,不可能马上去做单击的功能。它必须等待一定的时间,在这段时间内没有再次的按键,才能执行单击的功能。就是ms也必须这样。
那么如果ms不需要延时响应单击是必然要延时,你能具体说明它如何实现不等待的吗?你看到表象,好象ms的应用层收到的“单击”或“双机”事件,马上就去处理了,没有延时等待。但其实下层在给出“单击”事件前,已经吃掉延时时间。
下面给你一个参考的代码:
unsigned char key_rea......
-----------------------------------------------------------------------

抱歉我的那句话让你误解了,我表达得有问题。
我的意思是:ms的事件机制没有单击的延迟,但如果要对单击、双击定义完全不同的功能,需要自己做类似的处理(这时将引入单击延迟)。

我不是ms的程序员,但写过一些ms上的程序,虽然ms的底层不让动,但国内、外广大的系统研究爱好者、外挂作者、反外挂、反反外挂、杀软编写的人可是天天在ms系统的底层开战。扯远了。

出0入0汤圆

发表于 2011-8-28 07:59:32 | 显示全部楼层
回复【60楼】machao  
我没有动最低层i/o扫描按键的函数,只是稍微调整中间的代码,三段不同代码,分别对应三种不同情况。如果还不“开窍”,偶也没有办法了。已经解释到家了。
-----------------------------------------------------------------------

我并不是不理解你的代码,我也没有“反对”过你“最底层”的io扫描代码。

你看我的这句话:
----------
“对于第一点,就用手机的英文输入来讨论吧,要输入“AAA”,按照马老师前面的观点,这是类似于你双击的延时的例子。但请注意虽然输入第一个A需要等待一段时间后才能确认这个A,但从按下A到屏幕上看到这个A是即时而没有延时的,而你中间层的双击识别代码却是需要500ms延迟的,我想这个才是关键。如果你说为了实现这样的要求,需要不同的“中间层”,那么好了,这本来就是我的讨论的出发点。”
----------
看到你为了不要这个单击延迟,写了一个不同的中间层代码,最后这个中间层代码类似于ms的处理机制。

仔细想想,让你非常满意的是这种“最底层"+不同“中间层”的代码可以针对不同需要而可有不同功能的按键识别。
让我不舒服的是,楼主位的“中间层”代码有单击延迟。当然这并不是问题,因为对于单击、双击要定义风马牛不相及功能的情况下必须得有这个延迟。

出0入0汤圆

发表于 2011-8-28 08:09:44 | 显示全部楼层
我“开窍”了吗:

                          +  中间层1   +    应用层1
                          |
                          |
                          +  中间层2   +   应用层2
                          |
最底层i/o扫描  + |
                          +  中间层3   +  应用层3
                          |
                          |
                          +  中间层4 +   应用层4

不同应用层代表需要不同功能按键识别的情景,不同中间层对底层io进行这个转换,提供这个所需要的功能。
如果我把这个中间层理解为应用层的内部实现,也就是与应用层一层,就相当于应用层来识别单击、双击了。只是这样来理解,应用层内部分层了。

修改:
但,好像有一个问题:不同中间层代码是不能同时使用的,也不能即使用中间层又使用最底层,因为中间层使用的条件是:每10ms。
如果有两个任务需要两个不同的中间层,好像不能由这两个任务自己使用自己的中间层来处理按键,这会影响中间层的状态识别吧,按键是一个全局的资源,只能互斥访问。因此系统在一个时间段内只能有一个中间层处于活跃状态。因此只能这样用:

                         应用层
                             |
    ---------------------------------
    |                   |                   |                  |
状态1             状态2           状态3           状态4
  +                   +                  +                 +
中间层1         中间层2         中间层3        中间层4
   +-----------+---------+---------+
                               |
                         最底层IO

不同状态是应用层所处于的需要不同按键功能的不同阶段。

出0入0汤圆

发表于 2011-8-28 10:56:18 | 显示全部楼层
还是igoal把这个问题阐释得明白点。

出0入0汤圆

发表于 2011-8-28 13:05:07 | 显示全部楼层
回复【76楼】packer  
-----------------------------------------------------------------------

请参考农民讲习所通用程序的例子,在单片机中引入一个消息队列,并不会引入过分的资源占用吧,而且这样的消息队列并不仅仅只为
按键服务,为一个消息队列而付出的代价我认为是值得的,至少4096的flash还足以负担。

出0入0汤圆

发表于 2011-8-28 15:49:29 | 显示全部楼层
回复【80楼】packer  
回复【78楼】ifree64
-----------------------------------------------------------------------
再次表达对资源不受限的同志羡慕嫉妒恨。还引入消息队列,我经常1个字节ram掰成2个nibble用(还有人知道什么是nibble吗)
-----------------------------------------------------------------------

对这种资源首先的应用感兴趣,能说说你的资源情况并且要完成的功能吗?

出0入0汤圆

发表于 2011-8-28 18:07:18 | 显示全部楼层
回复【83楼】machao  

你提到了“因此系统在一个时间段内只能有一个中间层处于活跃状态。”,不知道你是明白了还是疑问。难道系统在一个时间段内能有几个任务处于活跃状态吗?

由于系统在一个时间段内能有1个任务处于活跃状态,所以不存在同时调用不同中间处理的情况。
-----------------------------------------------------------------------

unsigned char key_driver(void);                // 最底层

unsigned char key_read_1(void);                // 中间层1
unsigned char key_read_2(void);                // 中间层2
unsigned char key_read_3(void);                // 中间层3

如果有三个任务分别使用三个不同的中间层:

void task1(void)
{
        unsigned char key;
        //???
        while(1)
        {
        if(f10ms == 1)
        {
                f10ms = 0;
                key = key_read_1();
        }
        }
}

void task2(void)
{
        unsigned char key;
        //???
        while(1)
        {
        if(f10ms == 1)
        {
                f10ms = 0;
                key = key_read_2();
        }
        }
}


void task3(void)
{
        unsigned char key;
        //???
       
        while(1)
        {
        if(f10ms == 1)
        {
                f10ms = 0;
                key = key_read_3();
        }
        }
}

虽然task1、task2、task3不会同时运行,但通常它们是轮换着得到cpu时间,在各自的时间片里去调用
不同的中间层,但这些不同的中间层最终使用同一个底层,由于时间片通常实在ms级别的,最终还不得导
致所有状态乱套吗?除非一个task运行时另外的task在睡眠。



================
还是说MS的鼠标左键,你打开了2个窗口,一个是资源管理器(需要支持连击),另一个是编程器(不需要连击),那么你单击一下鼠标,2个窗口都会动作吗?不会吧。

鼠标的光标的位置,表明你现在哪个应用处在活动状态,你在资源管理器窗口下点击鼠标,资源管理器就调用自己的中间层,而在编程器窗口中,它调用另外的中间层。因此中间层的调用是不会出现冲突的。你把这个弄明白就可以了。
-------------------------------------------------------------------------
Windows是如何做到这个的我还是明白,但用你的中间层如何做到我就不明白了。这两个应用程序会按照系统的任务调度算法得到自己的CPU时间,
在自己的CPU时间里如何去每10ms调用一次中间层获取按键;两个应用程序轮流获得cpu时间的间隔可能就在10ms左右。这个情况下只能是系统
检测鼠标按键,根据当前哪一个是激活窗口,然后向哪一个激活窗口的消息队列发送鼠标键盘消息。恕我愚钝,实在想不出怎样在这样的情况下使用
不同的中间层,特别是这个中间层不是一个普通函数,而是一个需要每10ms调用的函数。



============================================
我不是ms的程序员,但写过一些ms上的程序,虽然ms的底层不让动,但国内、外广大的系统研究爱好者、外挂作者、反外挂、反反外挂、杀软编写的人可是天天在ms系统的底层开战。

井底之蛙的东西就不要多说了。你说的这些,基本上都不是真正的低层,还是中间层,甚至还只是中间层的上上层罢了。真正底层在哪里?在ROM中。你安装过什么程序,需要改写BIOS的?

=========================================================
井底之蛙是指的什么?很愿意听听我这方面认识到底局限在哪里?谢谢。

出0入0汤圆

发表于 2011-8-28 22:21:52 | 显示全部楼层
回复【89楼】machao  
回复【86楼】ifree64
-----------------------------------------------------------------------
不要再多说了,越说越不靠谱,会越丢人的。
我在83楼已经提到过“如果是在os支持下,程序的写法需要改变,但思想方法是不变的。”
现在我知道,我是高估你了。原先还以为你对操作系统os还有点概念,可能只是在某个环节上卡主了。现在我知道,你对os下的编程的思想基本是空白。
现在已经没有继续讨论何解释的必要了。还是建议多学习学习,掌握了一定的基础再说吧。
-----------------------------------------------------------------------

在我的贴子里写的那些代码当然是不能工作的。
不引入消息机制,以现在的中间层方法我不明白你如何能做到不同应用层使用不同中间层代码的。

哦,对了你说了os支持下写法需要改变,思想不变。把你现在的写法生硬的往多任务的方式套自然丢人了,不过丢人没关系,能从中学到点新东西就行了。

出0入0汤圆

发表于 2011-8-28 22:24:46 | 显示全部楼层
回复【90楼】packer  
回复【86楼】ifree64
回复【83楼】machao   
=========================================================  
井底之蛙是指的什么?很愿意听听我这方面认识到底局限在哪里?谢谢。
-----------------------------------------------------------------------
本来我还说马老师太尖刻,看了这个帖子看来一点不过。你对整个os概念很混乱,根基很差,知其然不知其所以然。
就知道时间论片,但不知道时间片是建立在什么基础上。
建议买本ucos-ii的书,从头照着一段段实现,你很多迷惑的东西迎刃而解。
-----------------------------------------------------------------------

那就请你先上一课吧,我对os的概念混乱在哪里?时间片建立在什么基础之上?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 21:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表