这个脚本可以对标准控件进行移动位置浏览效果

 

例如下图,就是按照Alt+鼠标左键,移动窗口里的控件效果展示

 

; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=175
#SingleInstance Force
CoordMode Mouse
SetControlDelay -1

; 热键:
; 1. Alt + LButton = 移动控件
; 2. Alt + Shift + LButton = 仅沿 X 轴移动控件
; 3. Alt + Ctrl + LButton = 仅沿 Y 轴移动控件
; 4. Alt + RButton = 调整大小
; 5. Alt + Shift + RButton = 仅调整控件宽度
; 6. Alt + Ctrl + RButton = 仅调整控件高度
; 7. Alt + MButton 或 Alt + Win + C = 更改控件内的文本
; 8. Alt + Shift + C:将控件坐标复制到剪贴板
; 9. Win + LButton = 启用/禁用控制

Menu, Tray, NoStandard
Menu, Tray, MainWindow ; 对于已编译的脚本
Menu, Tray, Add, &Reload, Reload
Menu, Tray, Add, E&xit, Exit

MsgBox 0x40, 把鼠标移动到控件上可对标准控件进行操作【包括此对话框】, 1. Alt + LButton = 移动控件`n2. Alt + Shift + LButton = 仅沿 X 轴移动控件`n3. Alt + Ctrl + LButton = 仅沿 Y 轴移动控件`n4. Alt + RButton = 调整大小`n5. Alt + Shift + RButton = 仅调整控件宽度`n6. Alt + Ctrl + RButton = 仅调整控件高度`n7. Alt + MButton 或 Alt + Win + C = 更改控件内的文本`n8. Alt + Shift + C:将控件坐标复制到剪贴板`n9. Win + LButton = 启用/禁用控制

; ExitApp   ; 已经改成 点击对话框的 "确定" 后,直接退出脚本。避免长期挂着影响全局日常操作
return

Reload:
  Reload
Exit:
  ExitApp

#!c::GoSub ChangeControlLabel

; 不能使用像 ~Alt & ~Button 这样的简单热键,因为这不会禁用窗口内的点击
Shift & ~Alt::
Ctrl & ~Alt::
~Alt::
Hotkey, *LButton, Alt_And_LButton, On
Hotkey, *RButton, Alt_And_RButton, On
Hotkey, *MButton, ChangeControlLabel, On
KeyWait, Alt
Hotkey, *LButton, Off
Hotkey, *RButton, Off
Hotkey, *MButton, Off

if (A_ThisHotkey = "*LButton")
  GoSub Alt_And_LButton
 else if (A_ThisHotkey = "*RButton")
  GoSub Alt_And_RButton
 else if (A_ThisHotkey = "*MButton")
  GoSub ChangeControlLabel
return


Alt_And_LButton:
iPrevMouseX := iPrevMouseY := A_Blank
MouseGetPos,,,, hCtrl, 2

while (GetKeyState("Alt", "P") && GetKeyState("LButton", "P")) {
  bIgnoreX := GetKeyState("Ctrl", "P")
  bIgnoreY := GetKeyState("Shift", "P")

  MouseGetPos, iMouseX, iMouseY
  iMouseX := iMouseX
  iMouseY := iMouseY

  ControlGetPos, iX, iY,,,, ahk_id %hCtrl%
  iXDelta := bIgnoreX ? 0 : iMouseX - (iPrevMouseX == A_Blank ? iMouseX : iPrevMouseX)
  iYDelta := bIgnoreY ? 0 : iMouseY - (iPrevMouseY == A_Blank ? iMouseY : iPrevMouseY)
  if (iXDelta <> 0 || iYDelta <> 0) {
    ControlMove,, iX + iXDelta, iY + iYDelta,,, ahk_id %hCtrl%
    DllCall("RedrawWindow", "Ptr", hCtrl, "Ptr", 0, "Ptr", 0, "UInt", RDW_INVALIDATE := 1 | RDW_ERASENOW := 0x200 | RDW_ERASE := 4)
  }
  iPrevMouseX := iMouseX
  iPrevMouseY := iMouseY
}
return


Alt_And_RButton:
iPrevMouseX := iPrevMouseY := A_Blank
MouseGetPos,,,, hCtrl, 2

while (GetKeyState("Alt", "P") && GetKeyState("RButton", "P")) {
  bIgnoreW := GetKeyState("Ctrl", "P")
  bIgnoreH := GetKeyState("Shift", "P")

  MouseGetPos, iMouseX, iMouseY
  iMouseX := iMouseX
  iMouseY := iMouseY

  ControlGetPos,,, iW, iH,, ahk_id %hCtrl%
  iWDelta := bIgnoreW ? 0 : iMouseX - (iPrevMouseX == A_Blank ? iMouseX : iPrevMouseX)
  iHDelta := bIgnoreH ? 0 : iMouseY - (iPrevMouseY == A_Blank ? iMouseY : iPrevMouseY)
  if (iWDelta <> 0 || iHDelta <> 0) {
    ControlMove,,,, iW + iWDelta, iH + iHDelta, ahk_id %hCtrl%
    DllCall("RedrawWindow", "Ptr", hCtrl, "Ptr", 0, "Ptr", 0, "UInt", RDW_INVALIDATE:=1 | RDW_ERASENOW:=0x200 | RDW_ERASE:=4)
  }
  iPrevMouseX := iMouseX
  iPrevMouseY := iMouseY
}
return


ChangeControlLabel:
; 关闭热键,使 LButton 无响应
Hotkey, *LButton, Off
Hotkey, *RButton, Off
Hotkey, *MButton, Off

; 这个热键好像每次激活都会触发两次,所以使用g_iTimeAtThisExecution来防止双重执行
g_iTimeAtThisExecution := SubStr(A_Now, StrLen(A_Now) - 3, 4)
if (A_ThisHotkey = "*MButton" && g_iTimeAtLastExecution != A_Blank && g_iTimeAtThisExecution - g_iTimeAtLastExecution < 1)
  return

MouseGetPos,,,, hCtrl, 2
ControlGetText, sExistingText,, ahk_id %hCtrl%
InputBox, sText, 设置修改目标文本,,,,,,,,, %sExistingText%

g_iTimeAtLastExecution := SubStr(A_Now, StrLen(A_Now) - 3, 4)
if (ErrorLevel)
  return

ControlSetText,, %sText%, ahk_id %hCtrl%
return


#LButton::
MouseGetPos,,,, hCtrl, 2
ControlGet, bEnabled, Enabled,,, ahk_id %hCtrl%
Control, % bEnabled ? "Disable" : "Enable",,, ahk_id %hCtrl%
return


!+C::
MouseGetPos,,,, hCtrl, 2
ControlGetText, sCtrlTxt,, ahk_id %hCtrl%
ControlGetPos, iX, iY, iW, iH,, ahk_id %hCtrl%
if !((iX == A_Blank || iY == A_Blank || iW == A_Blank || iH == A_Blank))
  clipboard := "Control:`t" sCtrlTxt "`nLeft:`t" iX "`nTop:`t" iY "`nRight:`t" iW "`nBottom:`t" iH
return

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。