Autohotkey 中文论坛

完整版: #IfWinActive 和 ExcludeText 的冲突如何解决?
你目前正在浏览的是简化版. 请点击这里浏览完整版
[i=s] 本帖最后由 cgx5871 于 2010-10-17 21:00 编辑 [/i]

例:把游戏分隔成两种情况
1. 有WinText (大厅或其他界面)
2. 无WinText (游戏中)
现在我有一组热键 在(游戏中启用) 问题是无WinText 不能当作决断条件
我想用#IfWinActive 怎么解决


同一游戏(ahk_game)中不同界面
我希望无WinText的时候启用1::a
有WinText的时候禁用1::a


界面A: WinText=7777
界面B: WinText=8888
界面C: WinText= (空)

脚本:

GroupAdd,AAA,ahk_game,,,,7777

#IfWinActive ahk_group AAA
1::a
2::b
3::c

界面A中, 这热键不成立 因为存在WinText=7777
界面B中, 这热键成立 因为不存在WinText=7777而成立
(存在WinText=8888作比较 所以能判断)
界面C中, 这热键还是不成立 因为存在WinText=空而不能比较? 其实我是希望这个时候成立的
用ahk_id(HWND)去指定窗口
ahk_id(HWND) 只能临时取得 支持IfWinActive
无法支持 #IfWinActive
如果用Hotkey 不能设置热字符命令
支持的,帮助里写的很明确嘛,虽然我没有实际试验过
用正则匹配窗口。

脚本开头(自动执行段)写一句
SetTitleMatchMode, RegEx
就算是 #if... 系列的命令也是可以用正则匹配的。

匹配WinText不为空的窗口:
#IfWinActive, ,.+
匹配WinText为空的窗口
#IfWinNotActive, ,.+

你可以试试以下脚本:
代码:
SetTitleMatchMode, RegEx
return

#IfWinActive, ,.+
x::MsgBox, "has wintext"

#IfWinNotActive, ,.+
x::MsgBox, "no wintext"
[i=s] 本帖最后由 cgx5871 于 2010-10-19 03:58 编辑 [/i]

以上都没有解决问题:
1. ahk_id(HWND) 这个只能游戏启动后获取, #IfWinActive 不能支持变量
2. 改用HotKey, 但HotKey 是不支持热字符的, 比如 Hotkey,wt, tttt, On 这样的命名是非法热键
3. 正则, 这个只是简化语句作用, 达到省略掉GroupAdd的繁复, 并不是问题关健,
问题的关健是 ExcludeText 我要判断为空字串状态

#IfWinActive, ,.+ 和GroupAdd 没有本质的差别


像#IfWinNotActive, aaaa,.+ 这样的语句 会连aaaa这个窗口都识别不了


我需要的是首先判断 WinTitle (这个不判断就毫无意义了) 再去判断WinText

目前有一个办法能临时解决就是:
GroupAdd,aaa,ahk_game,GUI:Join
#IfWinActive ahk_group aaa
7::3
#IfWinActive ahk_game
7::3

这样可以
(原理应该是相同WinTitle时, 有WinText的#IfWinActive 语句有优先权)
但这样我必须得两组重复的热键
热键很多, 这样就太亢余了


以上临时采用新建两个文本文档, 一个有内容 一个无内容来测试
我希望的目的是, 在无内容(无WinText) 时 热键生效, 有内容(WinText)后, 禁用
建议你使用AHK_L,那个#If 灵活的多
我的想法(未实践)
一个是使用你上面的方法,使用上下文相关热键
另一个是在热键下,首先获取窗口文本进行判断
窗口内容变了控件应该也有变,你选定一个只在某个界面才出现的控件,判断这个控件有没有出现或者enable就可以了。
看来还是没有什么好的提议,出于游戏的响应速度, 我的意思是用#IfWinActive 来决定热键 , 并不想在热键里增加各种判断之类
我敢说你没试过,所以我不说了。
引用:建议你使用AHK_L,那个#If 灵活的多
ashimoi 发表于 2010-10-19 08:19 [Image: back.gif]

我试了... 开始安装utf-8 引起脚本 全出错, 又改安装成ansi #if 还没去试
#If WinActive("ahk_class Notepad") 这种格式和 热键里用 IfWinActive("ahk_class Notepad") 有没有质的差别(我指的是速度响应) 还是只是语法格式改动了一下?
#ifwinactive 也要判断,不知此判断比其他判断响应快多少
這帖裡有提到#IfWinActive
所以我就這裡借問了
要怎么局限范围呢?
我的意思是当你在脚本里写上了#IfWinActive之后变成下面所有的都要在激活该页面的情况下才会运行
例如
代码:
#IfWinActive,ahk_class Notepad
{
f1::send^c
return

f2::send^v
return

f3::send^h
return
}
f12::reload
原本f12为全局重读脚本但因为上面加上了#IfWinActive,ahk_class Notepad
所以变成只能在记事本内重读就算用{}框起来一样无效
请问有解吗?
当然可以把f12放到#IfWinActive,ahk_class Notepad上面就可以执行了
但是我要的不是这样...
因为这样就不能在同一个脚本内写只有该个窗口会执行的脚本了
ex.若要用到
代码:
#IfWinActive,ahk_class Notepad
{
f1::
f2::
f3::
}
#IfWinActive,ahk_class MozillaUIWindowClass
{
f4::
f5::
f6::
}
f12::reload
参考网址