1)在AHK中虽然提供了菜单勾选check的命令以及切换勾选状态的togglecheck的命令,但是没有提供检查勾选状态的判断从而返回值。官方论坛上有一个方案,但是看了觉得好像太麻烦,而且深奥了。自己折腾中倒是无意发现了一个更简单的方案,思路是:

例如:设置一个可以勾选的菜单,例如“菜单1”,在勾选的时候,其菜单名称为“菜单1”,如果在非勾选状态的时候,设置其名称为“菜单1 ”,(这里添加了一个空格),这样一个巧妙的地方是菜单外观完全是一样的,但是实际上两个内容的文本时有区别的,所以这个时候根据对菜单名称来判断,如果带空格,那么表示为非勾选状态,如果不带空格,则为勾选状态,从而实现菜单勾选的事件。代码如下:

menu, tray, add, %g_menuitem_rc%, toggle_rc ;添加一个菜单,名称为变量,标签跳转为toggle_rc
if (g_menuitem_rc="菜单1") ;这时候不带空格,表示菜单应该处于被勾选check状态
 menu, tray, check, %g_menuitem_rc% ;勾选它

?

这样在程序运行中对菜单操作的时候:

 toggle_rc:
if (A_ThisMenuItem="菜单1 ") ;如果菜单名称带空格,表示处于未勾选状态,点击它就是要让它勾选
{
    menu,tray,rename, % "菜单1 ", % "菜单1"  ;将名称设置不带空格
    ;...
    勾选后要运行的代码
    ;...
}
else
{
    menu,tray,rename, % "菜单1", % "菜单1 " ;将不带空格的设置带空格的,表示要取消勾选
    ;...
    取消勾选的时候运行的代码
    ;...
}
 menu,tray,ToggleCheck, % g_menuitem_rc ;将菜单的勾选状态切换
return

这样就可以很巧妙的实现菜单勾选的事件,而且如果添加一个参数进入判断,在程序启动的时候根据此参数来判断菜单是否该处于勾选状态还是非勾选状态。

?

2)自己做了一个角落触发程序,当中有一个问题一直没有彻底的解决,就是根据第一次运行的hwnd,在第二次重复运行的时候恢复该hwnd(如果存在)的窗口,其中wechat微信程序经常出现丢失窗口无法显示的情况,用了winactivate,forcewinactivate,winwaitactivate都无法解决。可以明确存在此hwnd,而且可以获得该hwnd,但是就是无法恢复显示。

后来无意中发现了这样一条命令: winrestore , wintitle。

貌似彻底解决。

?

不过在官方论坛上有这样一个思路(未测试),就是利用while循环对每个窗体进行id匹配测试,不过觉得这个可能还是无法解决我这个问题。