AutoIt ControlCommand未按预期工作

时间:2013-06-05 00:03:10

标签: windows winapi autoit

我正在使用AutoIt尝试创建一个热键应用程序来使用Windows Journal,这样我就可以快速选择不同的颜色。

我似乎非常接近并且距离得到理想的结果还很远。我使用AutoIt工具查找工具栏的CommandID和颜色的ID。这是我的代码:

    ControlCommand("[CLASS:JournalApp]","",113,"SendCommandID", 40178)

我的问题是不会选择颜色。它将被选择到颜色将在其周围具有“选择”括号的程度,但是我绘制的颜色仍将是我选择的最后颜色。

所以我试着乱搞并发现这段代码:

    ControlCommand("[CLASS:JournalApp]","",113,"Check","")

确实会选择颜色,但它只会选择浅蓝色。我不知道为什么,但这是总是被选中的颜色。我还没有找到一种方法将“SendCommandID”的选择能力与“检查”的检查能力相结合

此外,它是一个ToolbarWin32控件。

1 个答案:

答案 0 :(得分:3)

我自己想通了。

这是我所学到的:

ControlCommand("[CLASS:JournalApp]","",113,"Check","") 

有严重的缺点,因为无法指定要检查的按钮。起初它似乎是随机的,但经过一段时间的游戏,我注意到它是在相对于客户端窗口的特定坐标处完成的。为什么?我不知道。但至少它不是随机的。

ControlCommand("[CLASS:JournalApp]","",113,"SendCommandID", 40178)

有一个弱点,虽然在表面上它似乎已成功点击按钮。按钮的功能实际上并未执行。根据我的具体情况,使用此笔后笔的颜色没有变化,虽然它似乎点击了按钮。

这是我的解决方案:

我环顾四周,发现AutoIt有一个专门用于处理ToolBarWin32类的库。这是来自GuiToolbar.au3的库。有了这个,我发现我能做一些事情。一个是,我可以发送点击按钮,甚至改变按钮的状态。我发现改变按钮的状态与触发事件和点击工作没有任何关系,但它有一个弱点,它导致鼠标退缩。这不起作用,因为我的笔靠近我的平板电脑,因为它优先于鼠标移动。因此,为了使用热键,我不得不将笔从平板电脑上抬起 - 不太方便。这是我的解决方案的代码:

if WinActive("[CLASS:JournalApp]") Then
    WinActivate("[CLASS:ToolbarWindow32; INSTANCE:2]", "")
    $cmdId = "401"&$hotKeys[$key-1+$shift]
    If $cmdId < 40172 or $cmdId > 40188 Then
        Return
    EndIf
    $hWnd = ControlGetHandle("[CLASS:JournalApp]", "", 113)
    _GUICtrlToolbar_ClickButton($hWnd, $cmdId)
EndIf

我之后发现AutoIt的原生ControlClick()更有用,因为它不会导致鼠标任何退缩。它直接触发了鼠标点击事件。因此,结合工具栏库中的一个很好的命令,可以实现更清晰的解决方案。这是:

if WinActive("[CLASS:JournalApp]") Then
    WinActivate("[CLASS:ToolbarWindow32; INSTANCE:2]", "")
    $cmdId = "401"&$hotKeys[$key-1+$shift]
    If $cmdId < 40172 or $cmdId > 40188 Then
        Return
    EndIf
    ConsoleWrite($hotKeys[$key-1])
    $hWnd = ControlGetHandle("[CLASS:JournalApp]", "", 113)

    ;get the coords of the button and control send a click
    local $btnCoords= _GUICtrlToolbar_GetButtonRect($hWnd, $cmdId)

    ControlClick("[CLASS:JournalApp]", "", "[CLASS:ToolbarWindow32; INSTANCE:2]","left",1,$btnCoords[0]+2,$btnCoords[1]+2)
EndIf