使用 PostClick 和 PostMessage 的 AHK 脚本
AHK Script using PostClick and PostMessage
我正在尝试编写一个简单的 AHK 脚本来键入几个字符并在背景中的特定坐标处单击几下 window,但我似乎无法让它工作,并且我没有找到很多关于如何正确使用 PostClick 的信息。
当 window 处于活动状态时,我能够使用 Click
使其工作。也尝试使用 ControlClick,这似乎有效,除了点击发生在鼠标所在的位置而不是提供的坐标上(并且仅当 window 再次被激活时)。
我能得到一些关于如何让它工作的帮助/建议吗?
这是我当前的脚本:
DetectHiddenWindows On
S:: ;Character to start the loop
pid = 19164 ;Application PID
ControlGet, clickVar, Hwnd , , ahk_pid %pid% ;Specify control for which program
BreakLoop = 0
Loop, 3 {
if (BreakLoop = 1)
break
Sleep 1000
PostClick(clickVar,1055,525)
{
ControlSend,, 3, ahk_pid %pid%
lParam := x & 0xFFFF | (y & 0xFFFF) << 16
PostMessage, 0x201, , %lParam%, , ahk_pid %pid% ;WM_LBUTTONDOWN
PostMessage, 0x202, , %lParam%, , ahk_pid %pid% ;WM_LBUTTONUP
}
Sleep 1500
}
E::
BreakLoop = 1
return
提前感谢您的帮助。
我假设您正在尝试使用 this function。
我不确定这个函数是如何工作的,但我想你想要的是这样的:
DetectHiddenWindows On
S:: ;Character to start the loop
pid = 19164 ;Application PID
ControlGet, clickVar, Hwnd , , ahk_pid %pid% ;Specify control for which program
WinGetTitle, clickTitle, ahk_pid %pid%
WinGetClass, clickClass, ahk_pid %pid%
BreakLoop = 0
Loop, 3
{
if (BreakLoop = 1)
break
Sleep 1000
PostClick(1055,525,clickClass, clickTitle)
ControlSend,, 3, ahk_pid %pid%
Sleep 1500
}
E::
BreakLoop = 1
return
PostClick(x, y, class, title)
{
lParam := x & 0xFFFF | (y & 0xFFFF) << 16
PostMessage, 0x201, 1, %lParam%, %class%, %title% ;WM_LBUTTONDOWN
PostMessage, 0x202, 0, %lParam%, %class%, %title% ;WM_LBUTTONUP
}
您需要将该函数放置在同一文件中的某个位置,或者至少可以被当前文件访问。如果需要,您可以在文件顶部执行 #include <script name here>.ahk
并将该函数作为新文件放在同一目录中。
您尝试使用的函数接受一个 x 和一个 y 来表示在该 window 中单击的位置。然后它还接受 class 和标题,以便知道实际使用哪个 window。希望这对您有用或能以某种方式帮助您。
我正在尝试编写一个简单的 AHK 脚本来键入几个字符并在背景中的特定坐标处单击几下 window,但我似乎无法让它工作,并且我没有找到很多关于如何正确使用 PostClick 的信息。
当 window 处于活动状态时,我能够使用 Click
使其工作。也尝试使用 ControlClick,这似乎有效,除了点击发生在鼠标所在的位置而不是提供的坐标上(并且仅当 window 再次被激活时)。
我能得到一些关于如何让它工作的帮助/建议吗?
这是我当前的脚本:
DetectHiddenWindows On
S:: ;Character to start the loop
pid = 19164 ;Application PID
ControlGet, clickVar, Hwnd , , ahk_pid %pid% ;Specify control for which program
BreakLoop = 0
Loop, 3 {
if (BreakLoop = 1)
break
Sleep 1000
PostClick(clickVar,1055,525)
{
ControlSend,, 3, ahk_pid %pid%
lParam := x & 0xFFFF | (y & 0xFFFF) << 16
PostMessage, 0x201, , %lParam%, , ahk_pid %pid% ;WM_LBUTTONDOWN
PostMessage, 0x202, , %lParam%, , ahk_pid %pid% ;WM_LBUTTONUP
}
Sleep 1500
}
E::
BreakLoop = 1
return
提前感谢您的帮助。
我假设您正在尝试使用 this function。
我不确定这个函数是如何工作的,但我想你想要的是这样的:
DetectHiddenWindows On
S:: ;Character to start the loop
pid = 19164 ;Application PID
ControlGet, clickVar, Hwnd , , ahk_pid %pid% ;Specify control for which program
WinGetTitle, clickTitle, ahk_pid %pid%
WinGetClass, clickClass, ahk_pid %pid%
BreakLoop = 0
Loop, 3
{
if (BreakLoop = 1)
break
Sleep 1000
PostClick(1055,525,clickClass, clickTitle)
ControlSend,, 3, ahk_pid %pid%
Sleep 1500
}
E::
BreakLoop = 1
return
PostClick(x, y, class, title)
{
lParam := x & 0xFFFF | (y & 0xFFFF) << 16
PostMessage, 0x201, 1, %lParam%, %class%, %title% ;WM_LBUTTONDOWN
PostMessage, 0x202, 0, %lParam%, %class%, %title% ;WM_LBUTTONUP
}
您需要将该函数放置在同一文件中的某个位置,或者至少可以被当前文件访问。如果需要,您可以在文件顶部执行 #include <script name here>.ahk
并将该函数作为新文件放在同一目录中。
您尝试使用的函数接受一个 x 和一个 y 来表示在该 window 中单击的位置。然后它还接受 class 和标题,以便知道实际使用哪个 window。希望这对您有用或能以某种方式帮助您。