当前位置:  开发笔记 > 编程语言 > 正文

使用钢琴键盘作为电脑键盘

如何解决《使用钢琴键盘作为电脑键盘》经验,为你挑选了22个好方法。

我有RSI问题,并尝试了30种不同的电脑键盘,这些都给我带来了痛苦.弹钢琴不会让我感到痛苦.我已经弹钢琴大约20年没有任何疼痛问题.我想知道是否有办法从MIDI键盘捕捉MIDI并输出键盘敲击.我对MIDI一无所知,但我想要一些关于如何将这个信号转换成击键的指导.



1> T.J. Crowder..:

多年来我没有做任何MIDI编程,但你的基本想法非常合理(没有双关语).

MIDI是"事件"(或"消息")的流,最基本的两个是"音符开"和"音符关",它们带有音符编号(0 = C中间C下五个八度,到127 = G在中间C上方的G上方五个八度音阶,半音调).这些事件在速度敏感("触敏")的键盘上带有"速度"数字,其力(你猜对了)在0到127之间.

在速度,和弦和踏板之间,我认为你可以为钢琴键盘提供一个非常好的"打字"界面.特别是Chording可能是一种非常强大的技术 - 正如我在评论中提到的那样,这就是为什么普通速记员可以使用stenotype机器来跟上人们连续几个小时说话,甚至顶级打字员也不会通过普通打字机式键盘可以持续任何时间.与机器速记一样,你需要一个关于和弦和和弦序列含义的"字典".(你能告诉我曾经在机器速记的软件方面工作吗?)

要做到这一点,基本的部分是:

接收MIDI输入.不要试图自己这样做,使用库.编辑:显然,Java Sound API 支持MIDI,包括从MIDI控制器接收事件.凉.此页面也可能有用.

将该数据转换为您要发送的击键,例如通过我上面提到的字典.

将击键输出到计算机.

要与软件最广泛地兼容,您必须将其写为键盘设备驱动程序.这是操作系统的插件,用作键盘事件的源,与底层硬件(在您的情况下,钢琴键盘)交谈.对于Windows和Linux,您可能希望使用C来实现.

但是,由于您只是生成击键(而不是试图拦截它们,我多年前就试图拦截它们),您可能可以使用操作系统发送人工击键的任何功能.Windows有一个用于执行此操作的界面(可能是几个,我正在考虑的是SendInput但我知道有一些类似的"日志"界面),我确信其他操作系统也可以.这可能足以满足您的目的 - 这是我开始的地方,因为设备驱动程序路径会很尴尬,您可能不得不使用与Java不同的语言.(我是Java的忠实粉丝,但操作系统用来与设备驱动程序通信的接口往往更容易通过C和类似的方式使用.)


更新:更多关于击键和弦的"字典":

基本上,字典是一个trie(谢谢,@ Adam),我们搜索最长前缀匹配.细节:

在机器速记中,速记员通过同时按下stenotype机器上的多个键来写入,然后将它们全部释放.他们称之为键盘的"中风"; 就像在钢琴上弹奏和弦一样.经常(但不总是)笔划对应于口语的音节.就像音节一样,有时一个笔画(和弦)本身就有意义,有时它只有跟随笔画的意思.(认为​​"好"与"好"后跟"再见").虽然他们会受到他们学习的学校的严重影响,但每位速记员都会有自己的"词典",说明他们用什么笔画来表示什么,他们将在他们的工作生涯中不断磨练的词典.字典将具有条目,其中速记部分(简称"steno")是一个笔划长或多个笔划长.通常,将存在具有相同起始行程的若干条目,这些条目通过它们的长度和随后的笔划来区分.例如(我不会在这里使用真正的steno,只是占位符),可能有以下条目:

A     = alpha
A/B   = alphabet
A/B/C = alphabetic
A/C   = air conditioning
B     = bee
B/C   = because
C     = sea
D     = dog
D/D   = Dee Dee

(这些字母不是音符,只是抽象的标记.)

请注意,A开始多个条目,并且还要注意您如何翻译C笔划取决于您之前是否看过a A,a B,或者您是刚开始新鲜的.

另请注意(尽管未在上面的极小样本中显示),可能有多种方法可以"播放"相同的单词或短语,而不仅仅是一种.速度训练器可以根据手的位置使前一个词更容易从下一个词流到下一个词.那里的音乐有一个明显的类比,你可以使用它来使你的打字流程更类似于播放音乐,以防止这对你的钢琴演奏产生负面影响,并最大限度地提高实际帮助RSI的可能性.

在将steno转换为标准文本时,我们再次使用"最长前缀匹配"搜索:转换算法从写入的第一个笔划开始,并查找以该笔划开始的条目.如果只有一个条目,并且它只有一个笔划,那么我们可以可靠地说"这是要使用的条目",输出相应的文本,然后在下一个笔划中重新开始.但更可能的是,该笔划会开始多个不同长度的条目.因此,我们查看下一个笔划,看看是否有条目以这两个笔划开始顺序; 等等,直到我们得到一个匹配.

所以使用上面的字典,假设我们看到了这个序列:

A C B B C A B C A B D

以下是我们如何翻译它:

    A是三个不同长度的条目的开始; 看下一招:C

    A/C只匹配一个条目; 输出"空调"并从下一次开始新鲜:B

    B开始两个条目; 看下一招:B

    B/B什么都不开始; 采取最长的前一场比赛(B)并输出("蜜蜂")

    输出B="bee",我们B的缓冲区仍然有一个笔画.它开始两个条目,所以看下一个笔划:C

    B/C匹配一个条目; 输出"因为"并在下一个笔画中重新开始:A

    A开始三个条目; 看下一招:B

    A/B开始两个条目; 看下一招:C

    A/B/C只匹配一个条目; 输出"字母"并从下一个笔划开始新鲜:A

    A开始三个条目; 看下一招:B

    A/B开始两个条目; 看下一招:D

    A/B/D不匹配任何东西,所以采取最长的前一个匹配(A/B)并使用它输出"字母".这让我们D仍然在缓冲区.

    D开始两个条目,所以我们通常会查看下一个笔划 - 但我们已经处理了所有笔划,因此请单独考虑它.孤立地,它翻译为"狗",因此输出.

以上方面要注意:

你有一个你读过但尚未翻译的笔画缓冲区.

您总是希望将最多笔画与您可以使用的单个条目进行匹配.A/B应翻译为"字母",而不是"alpha"和"bee".

(上面没有显示)你可能有不能翻译的笔画序列,因为它们与字典中的任何内容都不匹配.(Steno人使用名词"unranslate" - 例如,在我们的字典中,笔画E将是"unranslate".)

(上面没有显示)根据更广泛的背景,一些steno理论允许同一组笔画意味着不止一件事.斯特诺人称之为"冲突".你可能想要在你的项目中禁止它们,事实上当steno过去由stenographer手动翻译时,冲突很好,因为他们只知道句子中的位置是正确的选择,但是随着时间的推移机器翻译,无冲突的steno理论专门出现,以避免必须通过由此产生的翻译文本和"修复"冲突.

实时翻译(你正在做的)意味着如果你收到部分匹配,你会想要在等待下一个和弦时保持它 - 但可能只有一个超时,此时你会尽可能地翻译缓冲区中的内容.(或者你可能不希望超时;这是你的电话.)

可能最好有中风说"忽视以前的中风"

可能最好让中风"完全清除缓冲区而不输出任何东西"


@I__:有兴趣写*现在*来说.你还想要什么?我想我已经解决了你需要做的许多重要方面.我没有*做过它,也没有指向任何有过的人,因为我还有其他的事情可做而且不会碰巧知道预先构建的解决方案.但就*建立*解决方案而言,我认为我已经指出了正确的方向.
对于那些从未听说过的人,你描述的字典基本上是[Trie](http://en.wikipedia.org/wiki/Trie)(发音为'try')
@I__:有些程序试图直接与键盘设备对话,因此不能很好地使用类似"sendkeys"的接口.希望这比几年前我最后一次处理这个问题时更不常见,正如我所说的那样,我会从"sendkeys"开始,就像机制一样,只在需要的时候担心另一个.(可能最好做一个快速程序测试发送密钥[单独发送,而不是通过MIDI接收它们] - 包括特殊的密钥序列 - 然后在你走得太远之前用你想要控制的软件进行测试.)
@FeepingCreature:当我和速记员和法庭记者一起做这件事的时候,他们的词典可以很容易地输入成千上万的条目(我记得有一个人打破了百万大关).使用优化策略没有什么不成熟的,我们处理的是12 MHz 386.在我___的情况下,如果他采用Arduino的想法(这是一个非常酷的想法),他也会在现代时代处理相当不足的硬件,尽管当然比我们的东西快得多.我认为他的字典往往会小得多,但......
请注意,您可以将所有和弦卡在线性阵列中,并在每次收到midi事件时进行遍历,并且仍然没有经历任何明显的减速.使用trie略微过早优化.

2> Brian O'Dell..:

考虑在模拟usb(或ps/2?)键盘的硬件中做一些事情.您将不再依赖于特定的操作系统或特定的操作系统API.硬件解决方案经得起时间的考验.当其他人都运行Windows 11时,不要在Windows 7中使用旧的API卡住! Arduino很容易学习.

Arduino MIDI硬件现货供应

Arduinos已被用于模拟键盘设备

Arduino有很多信息和帮助.它是为新手打造的硬件黑客平台.只有谷歌推动Arduino,它才会变大.

编辑:虚拟USB键盘软件 和硬件


为计算机设计有用的钢琴界面并非易事.恕我直言,OP应首先在他/她目前的环境中对其进行原型设计,然后,如果它满足他/她的需求,则担心可移植性.当然,除非便携式替代方案明显更难.
@you你可能想要考虑一个teensy而不是arduino(http://www.pjrc.com/teensy/)明显更多的内存,并可以直接模拟键盘.它已与许多arduino库兼容,不兼容的只需要引脚重新分配. - 此外,atmega还制作了一个具有16 MB内置闪存的演示板,售价约为30美元(at90usbkey)

3> 小智..:

对我而言,听起来像是在寻找关于如何自己构建这个的建议,而是更多地询问已经有哪些资源来实现你想要的东西.根据您的操作系统,有许多方法可以实现这一点,而无需从头开始编写您自己的程序:

MIDI笔画

自由.适用于Mac OS X 10.3及更高版本.这个特别配备"能够使用任何MIDI键盘作为完整的电脑键盘更换."

Bome的MIDI翻译器

免费/明信片(这有点奇怪).对于Windows 2000和起来,和Mac OS X.它最初似乎更倾向于AutoHotkey类型的使用,但进一步看,我认为它可以做你想要的很好.

Max和aka.keyboard

自由.对于Mac OS X的.不完全是"开箱即用"的解决方案,但如果您对基本设备配置感到满意,那应该不会太糟糕.



4> Nasenbaer..:

您可以在MIDI DotNet中使用.NET中的源代码示例访问硬件.

一个完整的工作样本作为源代码创建MIDI音符数据流是在VB 5/6-Tipp 0521:MIDI-Töneerzeugen(Visual Basic 6.0,某处也是.NET版本)

一种模拟键盘敲击的方法是在VB 5/6-Tipp 0155:Tastaturereignisse simulieren(Visual Basic 6.0,某处也是.NET版本)

并且识别击键在Tipp-Upload:VB.NET 0266:Globaler KeyHook中描述.

在此输入图像描述

然后,只需为钢琴演奏者使用一个好的工作矩阵 Timo Boehme www.goldengel.ch

在钢琴上,当你是一个好的玩家时,你可以在键盘上有10个手指,如果矩阵可用,你可以比我想的任何计算机键盘用户快得多.:-)

在这种情况下,如果我理解你的问题,那应该不是一件大事.



5> P. Myer Nore..:

我在大学学习钢琴演奏,然后进入交互设计,编程和使用Vim,所以我实际上花了很多时间对这样的事情进行原型设计.

通过使用多媒体艺术家的图形编程语言" Pure Data "以及Alex Andre的外部x11key,您可以在Linux中快速完成此工作.

在Mac上,您可以使用MidiStroke.我相信Windows上的一种方法涉及MidiOx和AutoHotKey工具.在另一个时间我有一个版本使用Max/MSP的Java插件.我相信Patrice Colet为Pure Data制作了一个外部窗户,但是我似乎无法找到它.此外,MaxMSP的外部设备可以在Windows上执行此操作.最后,非自由但令人敬畏的Osculator可以做你想要的 - 看功能页面.

当我开始工作时,我从来没有坚持过,因为我无法停止使用布局工具.不过只是把我的显示器放在电动键盘上真酷!祝好运.



6> smartcaveman..:

关于MIDI

你声明你"对MIDI一无所知".一旦掌握了MIDI技术,它就相当直接,但一开始就会让人感到困惑.其中一个对我理解MIDI基础非常有帮助的资源(如果你想编写 MIDI交互,这当然是必要的),是一本名为MIDI for the Technophobe的书.这是一本易读的书,非常有帮助.


Pure Data&Max

根据我开发交互式多媒体的经验,我遇到过两个非常相似的程序,可以帮助连接和映射来自任何设备的信号/输入.

这些是适用于Mac环境的Max和适用于PC环境的Pure Data.两者都有大量的在线文档和YouTube教程.视频Max/MSP教程1 - 使用计算机键盘作为midikeyboard(能效风格)演示了一个用Max构建的程序,它将计算机键盘映射到MIDI键盘的输入(这基本上与您尝试做的完全相反).您可以使用相同的模式获得预期的结果,但可以反转信号/映射.


AutoHotkey的

AutoHotKey是一个免费的Windows开源实用程序,允许您将设备上的键和按钮重新映射到宏.它原生支持QWERTY键盘,游戏杆和鼠标宏.

但是,我能够找到支持您正在寻找的特定映射的实现.这两个线程解释了这个过程:

    在AutoHotkey中支持MIDI IN,讨论用例.作者正在寻找能够检测MIDI IN输入并将其转换为按键的程序.

    MIDI输入库,作者问题的解决方案以及AutoHotKey的发布代码/补丁,它实际上实现了您的预期结果.

基本上,看起来AutoHotKey以及该用户的自定义补丁将提供您创建从MIDI键盘到QWERTY键盘输入信号的映射所需的精确内容.您所要做的就是安装,配置和定义映射.


还要别的吗?

一般来说,其他一些答案已经为您提供了有关MIDI和MIDI编程的更多信息,但正如您的帖子所说,这似乎并不是您想要的.如果可能的话,我想帮助你更多,但如果你能更具体地了解你正在寻找的信息类型,那将会更容易.例如,您是否对如何将MIDI键盘的输入信号转换为QWERTY键盘信号更感兴趣,或者您是否主要关注针对特定问题的现成解决方案?您还在寻找什么尚未解决?



7> cmcginty..:

您可以使用Teenys微控制器快速破解自己的USB键盘.

事实上,他们有如何制作USB键盘的示例代码.

您可以采用以下两种方式:

    得到一把旧钢琴,并将开关直接连接到青少年

    添加附加逻辑以连接到MIDI端口和必要的解码.



8> Brendan..:

实际上,我刚刚研究过这个,试图将Rock Band鼓输入到我的计算机上(制作一个Java自制鼓模拟器)无论如何,我在这里问了一个问题,时间延迟问题(那里有轮询代码) ,以及我试图做的事情.)如果我能找到我的程序,我可以给你代码,它使用第三方API(JInput).

祝你好运.



9> 小智..:

试试Bome的MIDI翻译器.

它可以跨平台工作,可以轻松地将任何MIDI输入转换为键盘,快速设置和配置,以及免费供个人使用.

有一个教程,快速提示:MIDI翻译 - MIDI到击键,如何轻松设置它:

基本上,你可以做的事情有很多种,包括和弦键和修饰键.我将它用于我的现场音频设备,用我的钢琴控制我的DAW并且从未出现过问题.



10> Kamahire..:

在Java中,您可以使用JMF(Java Media框架)来转换MIDI信号.键盘设计的基础是易于使用,即用户界面; 并经常使用charcter /符号.

Java声音资源中的示例代码和API :示例:数字信号处理(DSP)有助于理解如何处理信号.

更多参考资料:

使用控件处理音频

数字音频信号处理,第2版



11> 小智..:

.NET中一个完整的midi支持(BASS)的好库,请访问http://www.un4seen.com.

而对于另一部分,将键盘midi音符转换为键等等,我会将AutoItX,ActiveX/COM和DLL接口转换为autoIt.信息和下载,请访问http://www.autoitscript.com/site/autoit/

无需编写键盘驱动程序.



12> Fox Wilson..:

有一个名为GlovePIE的程序.您可以使用简单的脚本语言对其进行编程,我相信它支持MIDI.我不确定这是否符合"Java"类别,但仍然是一个很棒的程序.我用它来控制使用PS3控制器的机器人.它非常强大.



13> Scott Rippey..:

许多键盘都有一个串行端口(RS-232)连接器,用于将MIDI信号发送到计算机.我使用一个名为Girder的程序将串口通信转换为键盘笔划.

Girder具有"映射"功能,可让您逐个将每个键映射到相应的击键.

这可能是您正在寻找的简单解决方案!



14> FastAl..:
只学习速记!

从您的所有讨论中可以清楚地看出来.从技术角度来看,您不想重新发明任何车轮.但是,一旦你建立了连接(这个问题是什么问题)并且正常工作,你仍然需要完成大部分工作:你必须训练你的大脑.你必须发明最聪明,最有效的方法来做到这一点 - 一个完全脱离计算机技术流程的设计问题.你或我们任何人都会失败.

幸运的是,这个问题在几个世纪的成熟过程中得到了解决和磨练......

学习速记!

是的,这会让你回到一些杰克.但是,你自己的时间数百小时的价值,最终是一个不太有利的结果呢?此外,维基百科的速记文章称,"它看起来更像钢琴键盘".

当然,除非你想要产生副作用.我不得不承认,我从未想过这种可能性,看到有人用钢琴键盘敲出文字真是太有趣了!

您可以从带触摸板的USB键盘开始(或者指点杆更符合人体工程学?),使用Plover进行翻译(我确信它可以配置为让非字母键保留其功能,因为它们对于编程),或者,按照线程Re:Plover键盘滚动自己的USB速记键盘,或者,购买一个stenotype.

祝好运!



15> bpeterson76..:

看看MAME街机游戏.他们构建了硬件设备,允许从任意数量的不同项目输入.的IPAC,例如,将来自输入设备的信号到USB计算机可以然后使用模拟密钥.你可以使用任何方式安排的输入设备的任何组合,这些输入设备看起来很舒服,不需要疯狂的编程逻辑 - 因为解释输入的软件已经完成并经过了充分测试.

我已经看到用这种方法制造的飞行模拟器驾驶舱输入,定制信息亭和投票系统.....价格合适!



16> Demolishun..:

要解决这个问题,您需要做一些事情:

    一种从键盘捕获MIDI数据的方法.根据界面:MIDI接口(经典)或USB MIDI接口(现代),最可能的接口是计算机,因为它提供了最多的选项.USB主控微控制器并不像使用计算机那么简单.

    将MIDI数据转换为击键的方案.就像一个用户指出的那样,和弦是要走的路,因为键的数量不依赖于钢琴键的数量.

    一种将密钥注入操作系统的方法.这将要求低级驱动程序准确.我已经玩过将键盘和鼠标数据注入到Windows 7中的应用程序中的应用程序,它可能不稳定,取决于应用程序当前是否处于焦点状态.这是界面中最难的部分.可能有用的是创建一个也具有串行接口的HID USB键盘微控制器.

串行接口将创建一个虚拟串行端口.读取MIDI数据并产生击键的软件可以向虚拟串行端口发送串行消息.微控制器将发送击键,使其看起来像标准键盘输入.这将允许连接MIDI端口和USB MIDI键盘.

嗯,通过这种类型的界面,您还可以模拟鼠标并使用一些钢琴键设置鼠标轴和按钮.压力可用于确定鼠标指针速度.所以你也可以消除鼠标.此方法的另一个好处是,您连接的任何类型的输入设备都可以与虚拟串行端口通信以生成键盘和鼠标事件.因此,如果您想添加鼓踏板或操纵杆等其他硬件,则需要调整与串行接口通信的程序.

上面的另一个看法就像上面发布的一些使用Arduino,但也包括来自Sparkfun的USB Host Shield来处理基于USB的音乐键盘.这允许Arduino在引导加载程序芯片中被编程为键盘或键盘鼠标组合,并允许设备作为基于USB的音乐键盘的USB主机.然后,您可以获得两种类型的保障.虽然,我仍然认为虚拟串口方法更灵活,从长远来看更容易编程.Arduino设备将比桌面程序或服务更难更改.

还有另一种可能性:已经存在Chorded单手键盘.我已经看过他们的视频,但你必须确定那些是否伤害了你的手.



17> 小智..:

通过声卡播放任何外部MIDI键盘作为控制器,您将获得更好,更快乐的结果(无论您喜欢使用哪种操作系统和/或DAW程序).然后将其路由到您的GB软件(或其他)和音调,生成他们实时提供给您的许多声音.

如果您的声卡不支持MIDI I/O(ins/outs/thrus),那不是问题.您可以考虑研究和投资外置MIDI桌面转换器.许多都配备了进一步将MIDI输出转换为USB 2.0(完全通过现有的声卡).

例如:使用计算机键盘和铅笔工具通过Z和X更改键选项获得"类似人类"的优雅音符效果非常困难.相反,当你自己的手指可以立即用自己的物理八度音域寄存器范围内的MIDI键盘播放时!

我意识到可能涉及预算限制.但是,在Radio Shack售价低于100美元(*或更低)的这些看似便宜的"Casio"5型八度音键板中的一些就是你所需要的(另外,它们的一些车载声音补丁和音序器模块听起来和处理其他事情也非常好).

RadioShack MIDI键盘选项.

对于现有声卡的外部MIDI转换器,我特别考虑到Mac平台上为您进行了一些Google搜索:

很多这种外部MIDI转换信息一开始对你来说可能很麻烦,所以为了你的考虑因素和预算,我把它们分解为"用户友好":

MIDI声卡

在使用DAW时,将虚拟键盘作为VST进行简化是没有错的.他们有自己的位置.

但是,你听起来像一个有成就的键盘手.那么,为什么不考虑我刚才提到的外部MIDI转换/键盘选项呢?

祝你好运,我希望这会给你一些能够并且对你有用的想法!



18> Simon Inns..:

使用.NET DirectSound接口挂钩到MIDI设备应该相当容易.您将需要识别您的目标MIDI设备,然后获取代码以收听传入的消息(有关于通过Google执行此操作的文章).

由于您将MIDI输入作为键盘使用,因此基本上只需要检测两条MIDI信息,即音符开和音符关.MIDI信息是三个数据字节,指定命令,音符和力度.音符关闭只是音符编号(有时'坏'MIDI堆栈以零速度发送音符,您也必须预期).

一旦你有消息翻译它们,键盘输出应该是非常简单的.NET.

关于技术性的其他答案中有很多建议; 我只是想让你了解实际的MIDI信息.祝好运!



19> Martijn..:

您可以使用简单的AutoIt脚本来读取MIDI事件,请参阅MIDI输入.

您还需要MIDI UDF并模拟按键.

读取MIDI事件应该很容易,但不同的MIDI控制器(乐器)具有不同的功能.尝试找出你的MIDI钢琴首先可以做什么,然后看看你如何最好地将这些功能映射到模拟QWERTY键盘按下.

如果你愿意,你可以对屏幕或托盘什么来帮助你看到你在做什么(即对Shift,CtrlAlt模拟).



20> Martin Odhel..:

如果你不想自己做任何编程,但只是想解决问题,你可以购买USB-MIDI键盘,你可以重新分配任何键来发送QWERTY键盘输出信号而不是MIDI输出,示例M-Audio Axiom Pro

此方法适用于任何操作系统和支持标准USB键盘的任何计算机,因为MIDI键盘将自己标识为标准QWERTY键盘.



21> Perkins..:

你可以看一下chorded键盘.它们的优点是在使用它们之前不需要为它们编写驱动程序,有些类似于钢琴键盘的布局.



22> dronus..:

如果你知道用Java编码,你可以这样使用:

首先,实现javax.sound.midi.Receiversend(..)像你想被映射事件"的说明"击键方法.

您需要使用其getMessage方法获取MidiMessage的内容并以您的方式对其进行解释.消息字节的含义可以在MIDI消息中找到.

在收到某个键盘键的'note on'或'note off'之后,你可以通过为它指定一个KeyEvent类的常量来将它映射到你喜欢的键,比如C#4 - > KeyEvent.VK_A等等. .然后,可以通过java.awt.RobotkeyPress和keyRelease方法使用此密钥代码将键击实际发送到操作系统,从而发送到其他应用程序.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有