使用AutoHotKey在Git Gui中检测焦点

Joe*_*ite 3 autohotkey focus

我正在尝试编写一个AutoHotKey脚本,该脚本将激活我的Git Gui窗口,刷新它,并将焦点放在提交注释文本框中。激活和刷新都没问题,但是改变重点并没有成功。AutoHotKey似乎无法正确检测Git Gui窗口中的子控件。

如果运行AutoHotKey的Window Spy实用程序,切换到Git Gui窗口,然后将鼠标放在提交注释文本框上,Window Spy将显示以下输出(缩写):

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
Git Gui (Tyler08) C:/svn/Tyler08
ahk_class TkTopLevel

>>>>>>>>>>>>( Mouse Position )<<<<<<<<<<<<<
On Screen:  808, 727  (less often used)
In Active Window:   816, 735

>>>>>>>>>( Now Under Mouse Cursor )<<<<<<<<
ClassNN:    TkChild18
Text:   
Color:  0xF0F0F0  (Blue=F0 Green=F0 Red=F0)
Run Code Online (Sandbox Code Playgroud)

因此,该编辑框的类名称似乎是TkChild18,我希望能够在AutoHotKey脚本中编写以下内容:

NumpadAdd::
ControlFocus, TkChild18, Git Gui (Tyler08) C:/svn/Tyler08
return
Run Code Online (Sandbox Code Playgroud)

但是,当我启动此脚本并按Numpad +时,什么都没有发生。我希望焦点可以移到提交评论文本框,但是焦点根本不会改变。

在尝试解决此问题时,我基于ControlGetFocus的AutoHotKey文档构建了以下脚本:

NumpadAdd::
ControlGetFocus, OutputVar, Git Gui (Tyler08) C:/svn/Tyler08
if ErrorLevel
    MsgBox, The target window doesn't exist or none of its controls has input focus.
else
    MsgBox, Control with focus = %OutputVar%
Run Code Online (Sandbox Code Playgroud)

现在,如果我激活Git Gui窗口并按Numpad +,则AutoHotKey会弹出一个消息框,内容为:“具有焦点的控件= TkChild1”。无论焦点在哪里-焦点是在提交注释文本框中还是在diff窗格中,还是在“新建提交”或“修改最后提交”单选按钮中或在任何按钮中- AutoHotKey始终报告焦点为TkChild1。这与Window Spy不同,后者可以查看所有子窗口(TkChild18等)。

上面的脚本至少可以与其他一些应用程序一起使用(只要我在第二行中更改了窗口标题)。如果WPF元素具有焦点(例如Visual Studio 2010中的“输出”窗口),它将显示其“目标窗口不存在...”失败消息,但如果WinForms控件具有焦点(例如VS2010的“属性”网格),则显示成功消息。所以我知道我为ControlGetFocus命令使用了正确的语法。我怀疑Git Gui的子窗口正在做一些奇怪的事情(它是用Tk框架构建的,这可能会使AutoHotKey无法处理某些奇怪的事情)。

有人对我如何获得AutoHotKey来成功更改Git Gui窗口内的焦点有任何想法吗?

在64位Vista上使用AutoHotKey Basic v1.0.48.00和mSysGit版本1.7.3.1-preview20101002。

mik*_*kew 6

我怀疑Git Gui的子窗口正在做一些奇怪的事情(它是用Tk框架构建的,这可能会使AutoHotKey无法处理某些奇怪的事情)。

我怀疑你是对的。Autohotkey的大多数命令只是MSFT Win32 api调用的包装。在这种情况下,ControlFocus可能只包装SetFocus()。如果TK框架不响应正常的Windows消息(例如WM_SETFOCUS),则这些消息将不起作用。

您的代码也在我的计算机上失败。我已经尝试了一个半小时,以找到一种解决方法,除了黑客以外,没有其他运气。显然,您可以发送TAB按键,直到您的提交消息编辑框具有焦点为止,但这是不可靠的,因为我们无法准确地检查哪个控件确实具有焦点。

因此,我能想到的最好的方法就是将基本信息发送Click到包装箱中。我尝试过ControlClick阻止鼠标移动,但是,与所有其他“控制”命令一样,它失败了。具有讽刺意味的是ControlGetPos,它允许这种解决方案(否则,如果调整Git Gui窗口的大小,则硬编码坐标将失败)。

SetTitleMatchMode, 2             ;// allow partial window title matches

NumpadAdd::
   WinActivate, Git Gui
   ControlGetPos, control_x, control_y, , , TkChild18, Git Gui

   CoordMode, Mouse, Screen
   MouseGetPos, mouse_x, mouse_y    ;// grab current mouse screen position

   click_x := control_x + 5      ;// we'll click 5 pixels inside the control
   click_y := control_y + 5
   CoordMode, Mouse, Relative
   Click %click_x%, %click_y%   ;// click relative to active window (moves mouse)

   CoordMode, Mouse, Screen
   MouseMove, %mouse_x%, %mouse_y%, 0   ;// restore old mouse position
return
Run Code Online (Sandbox Code Playgroud)