AutoHotkey 初学者向导

文章推薦指數: 80 %
投票人數:10人

这些特殊的命令(技术上称为"指令") 可以创建对上下文敏感的热键和热字串. 只需指定一个窗口标题. 但在某些情况下, 你可能需要指定一个窗口句柄, 组或类. 如果想深入了解 ... AutoHotkey初学者向导bytidbit 目录表 基础 下载和安装AutoHotkey 如何创建一个脚本 你不能合并命令 如何在你的电脑上找到帮助文件 热键&热字符串 按键和其神秘符号 窗口特定的热键/热字符串 一个脚本里使用多个热键/热字串 示例 发送按键 游戏 打开程序&网站 命令vs.函数 代码块 变量 什么时候使用百分号 获取用户输入 其他示例? 对象 创建对象 使用对象 其他有用的东西 神秘的方括号[] 查找你的AHK版本 尝试与错误 缩进 寻求帮助 其他链接 1-基础 在我们开始旅程之前,请允许我提些建议.在本向导中,你会看到大量的文字和代码.为了更有效的学习,建议你阅读这些文字并尝试运行这些代码.然后再深入学习这些代码.你可以复制并粘贴此页上的大多数示例.如果你弄糊涂了,试着再看一遍. a.下载并安装AutoHotkey 如果你是在本地查看此文档,你可能已经安装了AutoHotkey并且可以跳转到b部分. 在学习使用AutoHotkey(AHK)之前,你需要下载它.下载后,你可能会需要安装它.但这取决于你下载的版本.对于本指南,我们将使用安装版,因为对于新手来说,它最容易设置. 文字指导: 访问AutoHotkey主页:https://autohotkey.com/ 点击下载:https://autohotkey.com/download/ahk-install.exe 在安装Autohotkey过程中,需要你选择安装UNICODE或者ANSI版本.你很可能需要UNICODE版本,简单点说,如果你想要它支持非英文字符和数字,那就选择UNICODE版.版本选择之后,一直点下一步直到你看到安装(Install)按钮. 装完了?棒极了!我们接着往下看. 视频指导,请在YouTube(可能您无法打开)网站观看 InstallandHelloWorld b.如何创建一个脚本 Autohotkey安装完成后,你也许会想它能做些什么.AutoHotkey不是魔法,虽然我们都希望它是.所以需要我们告诉它要去干什么.而这个过程叫做"写脚本". 文字指导: 右键点桌面空白处. 点击"新建"菜单. 点击里面的"AutoHotkeyScript"新建一个脚本. 给脚本命名.备注:文件名必须带.ahk后缀,例如MyScript.ahk 找到刚刚新建的脚本并右键点击它. 点击"EditScript". 一个新窗口被弹出,也许是记事本.如果是这样就成功了! 现在你已经创建了一个脚本,我们需要加点内容到脚本中.如果需要用到内置命令,函数和变量,请查看第5节. 这是一个使用Send命令创建的一个包含热键的简单脚本,当你按下热键后,它会向窗口发送一段文字. ^j:: Send,MyFirstScript Return 稍后我们将进行更深入的研究.在此之前,我们先解释一下上面的代码: 第一行:^j::是热键.^代表Ctrl,j是字母J.任何在::左边的字符表示您需要按下的热键. 第二行:Send,MyFirstScript表示如何发送按键.Send是命令,任何在逗号(,)之后的内容将会被键入. 第三行:Return.Return将会成为你最好的朋友.从字面上看,它将停止代码继续往下.当你的脚本包含越来越多的东西时,使用Return会避免很多问题. 保存文件. 双击桌面上的文件来运行它,打开记事本或者其他可以输入文字的地方然后按下Ctrl和J. 太好了!你的第一个脚本完成了.给自己一些奖励,然后返回阅读本教程的其余部分. 视频指导,请在YouTube网站观看InstallandHelloWorld. c.不要合并命令 当你在写代码的时候,你可能有强烈的冲动想在同一行放下几个命令,或者在一个命令中嵌套多个命令,千万不要这样做.在第5节我们将会告诉你为什么不要这么做,同时,我们还将告诉你应该怎么做. d.如何在你的电脑上找到帮助文件 有几种方法可以做到这一点,假设你已将AutoHotkey安装到默认位置: 方案1: 找到开始菜单或屏幕上的开始按钮,通常在左下角. 点击程序或者所有程序. 在列表中查找AutoHotkey. 你会看到AutoHotkeyHelpFile.点击它. 完成! 方案2: 去你的桌面. 找到我的电脑或者计算机.然后打开它. 进入安装AutoHotkey的硬盘.可能是C:\盘. 在ProgramFiles文件夹里找到AutoHotkey. 查找AutoHotkey.chm或者找一个名叫Autohotkey并带有黄色问号图标的文件. 完成! 2-快捷键&热字串 什么是热键?热键是一个发热的按键,开个玩笑.热键是用来触发某些动作的按键或组合按键.例如: ^j:: Send,MyFirstScript Return 什么是热字串?当你键入它们时,热字串主要用于扩展缩写(自动替换).当然,它也可以用来启动任何脚本动作.例如: ::ftw::Freethewhales 这两个例子的区别在于,当你按下Ctrl+J时,热键将会触发,而热字串会将你输入的"ftw"转换为"Freethewhales". "那么,该如何创建一个热键?"好问题.热键是通过一对::创建的.按键名或组合按键名必须在::左边.代码则跟在下面,然后以Return结束. 注意:当然也有例外情况,但很多时候容易引起混乱,所以在向导页中不会涉及到它,至少不是现在. esc:: MsgBoxEscape!!!! Return 热字串在要触发文本替换的文本两边各有一对冒号(::).而替代键入文本的文本在第二对冒号::的右边. 如上所述,热字串也可以启动脚本动作.和热键一样能干好多事,真棒! ::btw:: MsgBoxYoutyped"btw". Return 有一个好消息是:你可以为每一个热键,热字串,标签等写上多行的代码. ^j:: MsgBoxWow! MsgBoxthisis Run,Notepad.exe Winactivate,Untitled-Notepad;无标题-记事本 WinWaitActive,Untitled-Notepad;无标题-记事本 Send,7lines{!}{enter} SendInput,insidethectrl{+}jhotkey Return a.键和其神秘符号 你可能会问"我怎么知道^代表Ctrl?!".好问题!为了帮助你学习^和其他符号的意思,注意看这个表: 符号 描述 # Win(Windows徽标键) ! Alt ^ Ctrl + Shift & 用于连接两个按键(含鼠标按键)合并成一个自定义热键. (完整的符号列表,请查看热键页面) 此外,对于所有/大多数能用于热键双冒号左边的热键名称,请参阅按键列表. 你可以通过在两个按键(除手柄键)之间,使用 & 来定义一个组合热键.在下面的例子中,你要按下Numpad0,再按下Numpad1或Numpad2,才能触发热键: Numpad0&Numpad1:: MsgBoxYoupressedNumpad1whileholdingdownNumpad0. Return Numpad0&Numpad2:: RunNotepad Return 如果你想知道热字串是否和热键一样有很酷的修饰符,答案是有!热字串的修饰符在第一对::之间,例如: :*:ftw::Freethewhales 想要查看更多关于热键和热字串修饰符的信息和实例,请访问:热键和热字串. b.窗口特定的热键/热字串 有时候你也许想要热键或热字串只在某些特定窗口上工作(或禁用).要做到这一点,您需要使用其中的任意一个"高级"命令,在它们前面带有一个#: #IfWinActive #IfWinExist 这些特殊的命令(技术上称为"指令")可以创建对上下文敏感的热键和热字串.只需指定一个窗口标题.但在某些情况下,你可能需要指定一个窗口句柄,组或类.如果想深入了解这些高级内容,点这里:WinTitle参数&最近找到的窗口. #IfWinActiveUntitled-Notepad;无标题-记事本 #space:: MsgBoxYoupressedWin+SpacebarinNotepad. Return 要关闭后续热键或热字串的上下文敏感性,请指定任意#IfWin指令,但将其所有参数留空.例如: ;无标题-记事本 #IfWinActiveUntitled-Notepad !q:: MsgBox,YoupressedAlt+QinNotepad. Return ;任何不是无标题-记事本的窗口 #IfWinActive !q:: MsgBox,YoupressedAlt+Qinanywindow. Return 当#ifwin指令在脚本中从未使用,所有的热键和热字串对所有窗口生效. #IfWin指令是与位置相关的:它们将影响脚本中的位于他们之间所有热键和热字串.它们也相互排斥的;也就是说,只有最近的一个会有效. ;记事本 #IfWinActiveahk_classNotepad #space:: MsgBox,YoupressedWin+SpacebarinNotepad. Return ::msg::YoutypedmsginNotepad ;画图 #IfWinActiveUntitled-Paint;无标题-画图 #space:: MsgBox,YoupressedWin+SpacebarinMSPaint! Return ::msg::YoutypedmsginMSPaint! 想要了解更多信息以及相似的命令,请查看:#IfWinActive页面. c.一个文件包含多个热键/热字串 这是一些人的想法.因此,我在这里声明一下:AutoHotkey有能力将任意多的热键和热字串放在一个文件中.不管是1个,还是3253个(或者更多). #i:: Run,https://www.google.com/ Return ^p:: Run,notepad.exe Return ~j:: Send,ack Return :*:acheiv::achiev ::achievment::achievement ::acquaintence::acquaintance :*:adquir::acquir ::aquisition::acquisition :*:agravat::aggravat :*:allign::align ::ameria::America 上面的代码是完全可以接受的.多个热键,多个热字串,都包含在一个大的脚本文件里. d.示例 ::btw::Bytheway;替换"btw"为"Bytheway",当你按下默认的终止符的时候. :*:btw::Bytheway;替换"btw"为"Bytheway"而不需要按下终止符. ^n::;Ctrl+N热键. Run,notepad.exe;当你按下Ctrl+N,将启动记事本. Return;热键内容结束.当按下热键时,下面的代码不会被执行. ^b::;Ctrl+B热键 Send,{ctrldown}c{ctrlup};复制选定的文本.也可以使用^c,但这种方法更加可靠. SendInput,[b]{ctrldown}v{ctrlup}[/b];粘贴所复制的文本,并在文本前后加上加粗标签. Return;热键内容结束,这之后的内容将不会触发. 3-发送按键 现在你决定发送(输入)一些按键到一个程序中.你可以使用Send命令.该命令表示发送按键,模拟打字或按键操作. 但是在我们准备使用Send之前,还有一些常见问题要注意. 就像热键一样,Send命令也有一些特殊的键.这里列出4个最常见的特殊按键: 符号 描述 ! 发送Alt.例如,SendThisistext!a将发送按键序列"Thisistext"并接着按下Alt+A.注意:!A在某些程序中产生的效果与!a不同.这是因为!A表示按下Alt+Shift+A而!a表示按下Alt+A.如果不确定,请使用小写字母. + 发送Shift.例如,Send+abC会发送文本"AbC",而Send!+a会按下Alt+Shift+A. ^ 发送Ctrl(Ctrl)键.例如,Send^!a会按下Ctrl+Alt+A,而Send^{Home}则发送Ctrl+Home.注意:^A在某些程序中产生的效果与^a不同.这是因为^A表示按下Ctrl+Shift+A而^a表示按下Ctrl+A.如果不确定,请使用小写字母. # 发送Win(带有Windowslogo的按键),因此Send#e会在按住Win时按下字母"e". Send页面中有个很大的表格展示了AHK内置的几乎所有特殊键.请点击查看.例如:{Enter}和{Space}. 警告:这个表并不适用于热键.也就是说,当你使用Ctrl或Enter(或其他按键)作为热键时,不要将它们括在{}中. 一个例子显示了不应该对热键做的情景: ;当你创建热键时... ;错误的 {LCtrl}:: Send,AutoHotkey Return ;正确的 LCtrl:: Send,AutoHotkey Return 很多人都有一个共同的问题,他们认为花括号(大括号)放在文档中仅仅是为了好玩.而实际上花括号是需要的.它将告诉AutoHotkey{!}表示"感叹号",而不是要"按下Alt".所以要仔细查看Send页上的特殊键表格,确保在合适的地方加上大括号.例如: Send,Thistexthasbeentyped{!} ;注意{}中的!(感叹号)?这是因为,如果没有{},AHK将按下Alt键. ;跟上面的例子类似,只是这次是Enter键.AHK将会输出"Enter" ;如果Enter没有加上{}的话. Send,MultipleEnterlineshaveEnterbeensent.;错误 Send,Multiple{Enter}lineshave{Enter}beensent.;正确 另一个常见的错误是,人们认为当使用Send命令时,所有内容都需要加上花括号.这是不对的.如果不在特殊按键列表中,没必要加花括号.你不需要给普通字符,数字加上括号,甚至像.(句点)这些符号加上{}.而且,当你在使用Send命令时,你可以一次性发送多个字符,数字或符号.所以没有必要为每一个字符写上一条Send命令.例如: Send,{a};错误 Send,{b};错误 Send,{c};错误 Send,{a}{b}{c};错误 Send,{abc};错误 Send,abc;正确 想要表示按住或松开某个按键,可以将这个键用花括号围起来,同时加上单词UP或DOWN.例如: ;下面这个例子表示按下一个键的时候再按下另一个键(或多个键). ;如果其中一个方法不奏效,试试另一个. Send,^s;都表示发送CTRL+s键击 Send,{ctrldown}s{ctrlup};都表示发送CTRL+s键击 Send,{ctrldown}c{ctrlup} Send,{bdown}{bup} Send,{Tabdown}{Tabup} Send,{Updown};按下向上键. Sleep,1000;保持1秒. Send,{Upup};然后松开向上键. 现在你可能会想,"怎样才能让我在发送超长文本时保证文本的可读性?".很简单.使用我们所说的延续片段.只需要在新行指定一个开括号,然后是内容,最后在它自己的行上加上一个闭括号.想了解更多信息,请阅读有关的ContinuationSections(延续片段). Send, ( Line1 Line2 Applesareafruit. ) 注意:Send命令有几种不同的形式.每种形式有其特性.如果一种形式的Send命令不能满足你的需要,可以试试另一种形式.只需要将"Send"命令替换成接下来的其中一个:SendRaw,SendInput,SendPlay,SendEvent.想要了解每一个命令的详细内容,请阅读这里. a.游戏 非常重要:很多游戏,尤其是新出的游戏,都有反作弊系统,例如GameGuard,Hackshield,PunkBuster等.且不说绕开反作弊系统是违反游戏规定的,绕开反作弊本身也不太容易实现. 如果游戏的反作弊系统导致你的热键,热字串和Send命令失效,你是不走运的.然而有一些方法也许能提高在某些游戏中使用热键的可能性,但没人能打包票一定能行.所以,尽可能尝试所有你能想到的办法,不要轻易放弃. 还有一个关于DirectX的问题要注意.当你在DirectX游戏中使用AutoHotkey碰到问题时,试试FAQ页面中描述的情况. 当你使用PixelSearch,PixelGetColor或ImageSearch命令时,你可能会碰到更多关于DirectX的问题.画面颜色可能会变成黑色(0x000000),不管你设置的是什么颜色.如果可能的话,试试用窗口模式运行游戏.这样做能够解决一些DirectX问题. 没有万能的办法能确保AutoHotkey能运行在所有程序里.如果你试了所有的办法还是不行,也许AutoHotkey暂时无法满足你的需要. 4-打开程序&网页 想要打开诸如画图(mspaint.exe),计算器(calc.exe),脚本.ahk或一个文件夹,你可以使用Run命令.你还可以用这个命令打开一个网址,比如https://autohotkey.com/.如果你想打开一个已经安装好的程序,也很简单,就像这样: ;运行一个程序.注意:大部分的程序可能需要完整路径. Run,%A_ProgramFiles%\Some_Program\Program.exe ;打开一个网址 Run,https://autohotkey.com 还有其他一些高级特性,比如命令行参数和CLSID(Windows类标识符). 下面是一些关于Run命令的示例: ;一些程序并不需要完整路径,如Windows标准程序. Run,notepad.exe Run,msPaint.exe ;使用AHK内置变量来打开"我的文档" Run,%A_MyDocuments% ;打开一些网页: Run,https://autohotkey.com Run,https://www.google.com 想要深入了解更多信息和示例,请查看:Run页面. 5-命令和函数 AutoHotkey有两个重要的工具供开发者使用:命令和函数. 所有命令和内置函数的列表可以在这里找到. 命令 你可以通过语法来分辨命令和函数.命令后面的参数无需使用圆括号,而函数需要使用.所以命令就像下面这样: Command,参数1,参数2,参数3 当你使用命令时,不能将几条命令放在同一行(IfEqual除外).也不能将一个命令作为参数插入到另一个命令.例如: MsgBox,HelloRun,Notepad.exe;错误 MsgBox,Hello,Run,Notepad.exe;错误 MsgBox,Hello;正确 Run,Notepad.exe 跟函数不同的是,命令使用"传统语法".这意味着需要在变量的前后加上%,比如%Var%.而文本和数字则不需要加双引号,例如Thisissometext.另外,与函数不同,命令的参数不能进行运算. 如果确实想要在参数中进行运算,可以使用单个%来强制定义一个表达式,但我们这里将不涉及这些内容. 函数 如上所述,函数不同于命令的地方在于函数需要使用圆括号.一个典型的函数是这样的: Function(参数1,参数2,参数3) 与命令相比,函数有下面几个主要差异: 你可以使用运算. SubStr(37*12,1,2) SubStr(A_Hour-12,2) 变量不需要加上百分号: SubStr(A_Now,7,2) 函数可以嵌套另一个函数: SubStr(A_AhkPath,InStr(A_AhkPath,"AutoHotkey")) 文本前后需要加上双引号: SubStr("I'mscripting,awesome!",16) 函数通常会返回一个值,这一点与命令也不一样.命令需要设置OutputVar参数来保存结果,而函数不需要.将函数值赋给变量的最常用方法,只需要这样做: MyVar:=SubStr("I'mscripting,awesome!",16) 这不是赋值的唯一方法,但这是最常用的.您使用MyVar来存储函数的返回值,即写在:=操作符的右边,更多信息,请参阅函数页面. 简而言之: ;这些是命令 MsgBox,Thisissometext. StringReplace,Output,Input,AutoHotKey,AutoHotkey,ALL SendInput,Thisisawesome{!}{!}{!} ;这些是函数 SubStr("I'mscripting,awesome!",16) FileExist(VariableContainingPath) Output:=SubStr("I'mscripting,awesome!",16) a.代码块 代码块就是用一对花括号({和})包围起来的一段代码,AutoHotkey以此来判断这些代码是一个整体.代码块经常用于If和Loop中.如果不使用花括号,整块代码中只有第一行代码能被执行. 下面的代码中,当MyVar等于5时,所有行都会执行. if(MyVar=5) { MsgBox,MyVarequals%MyVar%!! ExitApp } 下面的代码中,当MyVar等于5时,才能显示消息框.但即使MyVar不等于5,脚本也始终会退出: if(MyVar=5) MsgBox,MyVarequals%MyVar%!! ExitApp If后面只有一行与它有关的代码,下面的例子做了一个非常好的代码编写示范.它实现的功能跟上面的代码一样,但是我将第二行代码进行了缩进排版,这样写让我们很容易就知道这行代码是跟If相关的: if(MyVar=5) MsgBox,MyVarequals%MyVar%!! MsgBox,Wearenow'outside'oftheif-statement.Wedidnotneedcurlybracketssincetherewasonlyonelinebelowit. 6-变量 变量就像一个包含信息的便利贴.它可以用于函数,命令或数学表达式中,充当存储文本,数字,数据的作用.如果没有变量,程序和脚本将会非常乏味. 给变量赋值有很多方法,我们将会讨论最常见的几种方法.请特别留意等号(=). 传统的文本赋值 MyVar=Text 这是给变量赋值最简单的方法,也是传统的赋值方法.只需要在等号后面输入文本就行了. 传统的变量赋值 MyVar=%MyVar2% 和上面的方法类似,只是你将一个变量所对应的值赋给了另一个变量. 传统的混合赋值 MyVar=%MyVar2%sometext%MyVar3%. 以上两个传统赋值的组合. 表达式文本赋值 MyVar:="Text" 这是一个表达式赋值,因为:在=之前.任何文本都需要在引号中间. 表达式变量赋值 MyVar:=MyVar2 在表达式模式中,变量不需要百分号. 表达式数字赋值 MyVar:=6+8/3*2-Sqrt(9) 感谢表达式,你能进行计算! 表达式混合赋值 MyVar:="Thevalueof5+"MyVar2"is:"5+MyVar2 以上三个表达式赋值的组合. 等号(=)和它前面的符号,如:=+=-=.=等等,这些被称为赋值运算符,并且总是需要一个表达式. a.什么时候使用百分号 关于变量一个最常见的问题是什么时候使用百分号(%).希望下面这些内容能够消除一些困惑. 什么时候要使用百分号: 当你使用命令时(见前文),参数是输出变量OutputVar或输入变量InputVar时除外. 当你使用传统模式(等号前面没有其他符号)给一个变量赋值时. 什么时候不要使用百分号: 参数中的输入或输出变量.例如:StringLen,OutputVar,InputVar 赋值时左边的变量:例如:Var=123abc 在传统If语句(不包括表达式)中,中左边的变量:IfVar1例如,在ControlGetText命令页面,你可能会看到这段代码: ControlGetText,OutputVar,Control,WinTitle,WinText,ExcludeTitle,ExcludeText 所以你可以简单的写成这样: ControlGetText,OutputVar 或者再加上一些细节: ControlGetText,OutputVar,Control,WinTitle 如果你想只使用参数ExcludeTitle而不想使用参数WinText或WinTitle,怎么办?很简单! ControlGetText,OutputVar,Control,,,ExcludeTitle 请注意,你不能忽略参数,只是需要将它们的位置留空.如果你像下面这样忽略WinTitle,WinText,将会产生错误: ControlGetText,OutputVar,Control,ExcludeTitle b.查找你的AHK版本 你可以运行下面的代码来查看你的AHK版本信息: MsgBox,%A_AhkVersion% 你也可以到开始菜单或安装路径下的帮助文件(即本文)中去找. c.尝试与错误 尝试和错误是非常普遍而高效的学习方法.与动不动就问这问那相比,有时候花点时间(也许是长年累月)亲手尝试可能会学的更快. 如果你在尝试新东西的过程碰到错误,不要紧,就从解决这个错误开始.尝试解决这个错误,一次不行就两次.多次尝试后还是解决不了,可以打开帮助文件学习哪些能做哪些不能做,然后修改你的代码再试试.试试,失败,试试,失败,试试,试试,再试试,失败,失败,成功! 这也是很多大师们的学习经历.不过也不要害怕提问,我们不会咬人(至少不会咬的太狠).学习总需要时间慢慢积累,大师也不是一天练成的. "若最初你没有成功,努力,努力,不断的努力."-威廉·爱德华·希克森. d.缩进 缩进这个事非常重要!你的代码没有它也能正常运行,可是如果没有缩进会让阅读代码变成一件非常痛苦的事.也许一小段代码(少于25行)不用缩进也没有太大关系,但是代码一旦增多,缩进就非常有必要.所以,学习使用缩进越快越好.缩进没有固定的风格,但最好保持一种风格. "什么是缩进?"你可能会问?简单的说就是在代码和页面边界保留一段距离,这样可以区分这一段代码是属于哪一段代码.有些人习惯使用3,4个空格或1个tab来表示缩进,每一级用一次缩进. 不用缩进: if(car="old") { MsgBox,Thecarisreallyold. if(wheels="flat") { MsgBox,Thiscarisnotsafetodrive. Return } else { MsgBox,Becareful!Thisoldcarwillbedangeroustodrive. } } else { MsgBox,My`,whatashinynewvehicleyouhavethere. } 使用缩进: if(car="old") { MsgBox,Thecarisreallyold if(wheels="flat") { MsgBox,Thiscarisnotsafetodrive. Return } else { MsgBox,Becareful!Thisoldcarwillbedangeroustodrive. } } else { MsgBox,My`,whatashinynewvehicleyouhavethere. } 关于缩进,维基百科上缩进样式页面有很多风格示例.建议选一种你喜欢的或你认为最容易阅读的风格来学习. e.寻求帮助 在你提问之前,最好自己先研究一下或者自己先动手试着写代码.如果自己实在得不到满意的结果,请往下看. 不要害怕提问,即使是世界上最聪明的人也需要别人的帮助. 不要害怕给别人看你写的代码,就算你觉得代码有点弱智. 将所有你尝试的代码都贴出来. 假设其他人都是门外汉.把你掌握的所有信息都教给我们这些门外汉.帮助我们就是帮助你自己. 耐心. 礼貌. 开放. 友善. 祝你好运. 如果你没有马上得到答案,至少等一天再提问.我们乐于助人,但是我们也是在自己的空余时间里免费提供帮助.也许我们正在工作,睡觉,玩游戏,和家人在一起或太忙了,没有时间帮忙. 在等待帮助时,你也可以试着自己动手解决.独立解决问题的感觉相当不错. f.其他链接 常见问题(FAQ)



請為這篇文章評分?