SetTitleMatchMode, 2很晦涩, 意思是匹配窗口的标题时, 使用strstr 来查找, 默认的模式1是用 strncmp来查找的, 要求指定的窗口标题必需是开始的字串部分.
这在实际使用AutoHotkey是极其不便.
碰到这个问题是因为我的Araxis今天升级到了2009版, 与前一版相比, 它的窗口标题变成了
C:\Program Files\AutoHotkey\license.txt - Araxis Merge
而不是前一个版本的
Araxis Merge - C:\Program Files\AutoHotkey\license.txt
这一小小的改动暴露了AutoHotkey的问题:
它在匹配窗口标题时, 只能使用整个字串开始的部分.
AutoHotkey 可以使用窗口类的名字来匹配, 对于Notepad这样的程序来说, 这样还更好, 毕竟窗口标题更容易被改变. 但对于Araxis不行, 它每次运行时的窗口类名是变化的:
#IfWinActive Araxis Merge
; #IfWinActive ahk_class Afx:00400000:8:00010011:00000006:010207A9
^!w::Send ^{F4}
^!a::
; Should wait the Alt being released after released the CTRL+ALT+A before
; sending the command because there's ALT which will active ; The menu's. Without
; such command the menu will fclickering but command not got being executed
KeyWait Alt
; ALT+W Opens the "Window" Menu, and l execute the "Close All" menu item
Send {Alt}wl
return
其中 010207A9 这一部分每次启动一个新的实例都会变化. 所以这一招失效了.
一开始还一直怀疑是Araxis的新版本对快捷键的管理发生了变化导致不能使用 AutoHotkey, 后来用Notepad证实, 是非常常用的
SetTitleMatchMode, 2
命令不能如期生效.
到它的论坛上一搜, 果然找到了有人碰到了同样的问题, 下载了最新的版本, 也没有解决这个bug.
好在这个工具有源代码, 猜测它是用strncmp来进行字符串开头部分的匹配, 一搜, 代码中使用该函数的地方并不多. 找到了下面的地方强制给改成:
case FIND_IN_LEADING_PART:
#if 0
if (strncmp(mCandidateTitle, mCriterionTitle, mCriterionTitleLength))
return NULL;
break;
#endif
case FIND_ANYWHERE:
{
std::string title(mCandidateTitle);
std::string part_title(mCriterionTitle);
std::transform(title.begin(), title.end(), title.begin(), ::tolower );
std::transform(part_title.begin(), part_title.end(), part_title.begin(), ::tolower );
// if (!strstr(mCandidateTitle, mCriterionTitle)) // Suitable even if mCriterionTitle is blank, though that's already ruled out above.
if (title.find(part_title.c_str()) == std::string::npos) // Suitable even if mCriterionTitle is blank, though that's already ruled out above.
return NULL;
break;
}
|
有点暴力, 干脆去掉了只对Title开头部分的匹配, 改用不区分大小写的 strstr版本--STL string.
终于又能在Araxis merge里用 CTRL+ALT+W 关闭一个比较窗口了.
下载的 AutoHotkey是 1.0.48.03 版, 如果版本匹配, 可以下载这个修改后的源文件:
|
文件: | AutoHotkey.zip |
大小: | 237KB |
下载: | 下载 |
|
已经用upx 压缩过, 再用ZIP压一次纯粹因为CU的上传限制.
阅读(1923) | 评论(0) | 转发(0) |