Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2359178
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-05-06 14:33:47

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的上传限制.
阅读(1555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~