Winforms 自动热键-如何单击ClassNN发生更改的控件?

Winforms 自动热键-如何单击ClassNN发生更改的控件?,winforms,autohotkey,Winforms,Autohotkey,我试图在一个程序中实现工作流自动化,但遇到了一个障碍。我通常使用ControlClick单击按钮,但是对于这个特定的控件,ClassNN在程序每次重新加载时都会更改。我尝试使用控件文本,但窗口中有两个控件具有相同的文本,这似乎阻止了命令的执行 还有什么我可以试着让ControlClick工作的吗?还是我可以采取另一种方法?我不想在(x,y)坐标处单击,因为控件可能会根据用户的分辨率和任务窗格大小而移动 我使用的命令是: ControlClick,checkButton3,Bystronic By

我试图在一个程序中实现工作流自动化,但遇到了一个障碍。我通常使用
ControlClick
单击按钮,但是对于这个特定的控件,
ClassNN
在程序每次重新加载时都会更改。我尝试使用控件文本,但窗口中有两个控件具有相同的文本,这似乎阻止了命令的执行

还有什么我可以试着让
ControlClick
工作的吗?还是我可以采取另一种方法?我不想在(x,y)坐标处单击,因为控件可能会根据用户的分辨率和任务窗格大小而移动

我使用的命令是:

ControlClick,checkButton3,Bystronic BySoft 7

这适用于其他相邻按钮,因为它们具有唯一的控件文本


试试这样的方法:

WinGet, List, ControlList, Bystronic BySoft 7
Loop, Parse, List, `n
{
    If InStr(A_LoopField, "WindowsForms10.Window") ; use only the part of the name that is always shown in WS
    {
        ControlGetText, Text, %A_LoopField%, Bystronic BySoft 7
        If InStr(Text, "checkButton3")
        {
            ControlGetPos, XX, YY, WW, HH, %A_LoopField%, Bystronic BySoft 7
            If (XX < ... && YY... &&...) ; relative position, you don't have to define it exactly)
            {
                ControlClick, %A_LoopField%, Bystronic BySoft 7
                    break
            }       
        }
    }
}

我在一个应用程序中遇到了同样的问题。两个按钮交换ClassNN

称它们为按钮%Up%和%Down%。它们是按钮7或按钮9,可以是WindowsForms 10.xxx.yyy.zzz 1234或WindowsForms 10.xxx.yyy.zzz 1235

我应该注意到,这两个按钮始终是上述两个值之一。应用程序中的所有其余控件保持不变。应用程序运行后,%Up%和%Down%按钮不会更改

在应用程序的开头,我查找两个按钮的位置,一个是ControlGetPos for WindowsForms 10.xxx.yyy.zzz 1234,另一个是ControlGetPos for WindowsForms 10.xxx.yyy.zzz 1235

%Up%按钮位于屏幕上的%Down%按钮上方,因此屏幕位置较高的ControlGetPos变为%Up%,而另一个变为%Down%

ControlClick,%Up%,Wintitle.%最多%是WindowsForms 10.xxx.yyy.zzz 123?更高屏幕位置的


无论屏幕分辨率如何,按钮相对于其他按钮的位置决定了它将被标记的内容

这比盲目单击(x,y)位置要好。但是,有四个控件具有相同的文本,它们彼此相对接近。用户可以隐藏功能区、重新定位窗格等,所有这些都将显著调整所需控件的位置。不幸的是,位置检查似乎使此解决方案有些不可靠。
Index := ""
WinGet, List, ControlList, Bystronic BySoft 7
Loop, Parse, List, `n
{
    If InStr(A_LoopField, "WindowsForms10.Window") ; use only the part of the name that is always shown in WS
    {
        ControlGetText, Text, %A_LoopField%, Bystronic BySoft 7
        If (Text = "checkButton3")
        {
            Index++
            If (Index = 2) ; try also "If (Index = 3)" and "If (Index = 4)" until  you find the right one. If "If (Index = 1)" is the right one you don't need the variable Index.
            {
                ControlClick, %A_LoopField%, Bystronic BySoft 7
                    break
            }       
        }
    }
}