阅读:2155回复:0

小小输入法状态栏拖动逻辑补充与位置限制

楼主#
更多 发布于:2025-12-16 23:20
1、拖动逻辑补充了,鼠标在状态栏任意位置按下鼠标左键(持续时间超过0.5秒)可拖动状态栏;
2、位置限制了,状态栏不可拖出工作区域之外;
下面是AHK V2的实现脚本:
#SingleInstance Force
#HotIf MouseIsOver("ahk_class yong_main")
 
~LButton::
{
  ; 循环外获取初始值(标准做法,最可靠)
  CoordMode("Mouse", "Screen")
  MouseGetPos &StartX, &StartY, &Win
  WinGetPos &WinX, &WinY, &WinW, &WinH, "ahk_id " Win
  MonitorGetWorkArea(, &WorkLeft, &WorkTop, &WorkRight, &WorkBottom)
  if !KeyWait("LButton", "T0.5") {
    while GetKeyState("LButton", "P") {
      MouseGetPos &CurX, &CurY
 
      ; 计算新位置
      NewX := WinX + CurX - StartX
      NewY := WinY + CurY - StartY
 
      ; 更新新位置
      WinX := NewX
      WinY := NewY
      StartX := CurX
      StartY := CurY
 
      ; 边界截断
      NewX := Max(NewX, WorkLeft)
      NewX := Min(NewX, WorkRight - WinW)
      NewY := Max(NewY, WorkTop)
      NewY := Min(NewY, WorkBottom - WinH)
 
      ; 移动窗口
      DllCall("SetWindowPos", "ptr", Win, "ptr", 0, "int", NewX, "int", NewY, "int", 0, "int", 0, "uint", 0x0005)
      Sleep 10
    }
    ; 拖动后保存位置,x坐标加一防止窗口被拖到左上角松开后(坐标为0, 0)又自动跳至右下角(pos为0时默认位置为右下角)
    RunWait('d:\yong\w64\yong-config.exe --set main pos ' NewX+1 ',' NewY, , "Hide")
  }
}
 
#HotIf
MouseIsOver(WinTitle)
{
    MouseGetPos(,, &Win)
    return WinExist(WinTitle " ahk_id " Win)
}
游客

返回顶部