一、问题描述
二、根本原因
三、最终解决方案
使用 AutoHotkey 编写脚本,实现:
优点:

四、完整 AutoHotkey 脚本
autohotkey
; ====================================================
; 脚本名称:Creo_悬停缩放.ahk
; 功能:不关闭系统“悬停滚动”,在非活动 Creo 窗口模型区滚轮缩放
; 使用:以管理员身份运行;需将下方 targetProc 改为自己的 Creo 进程名
; ====================================================
#SingleInstance Force
#Persistent
; 声明按显示器 DPI 感知,防止坐标偏移
DllCall("SetProcessDpiAwareness", "Int", 2)
; ★ 修改为你的 Creo 进程名(任务管理器 → 详细信息,例如 xtop.exe)
targetProc := "xtop.exe"
#If MouseIsOverCreoMainWindow(targetProc)
WheelUp::
WheelDown::
creoHwnd := WinExist("ahk_exe " targetProc)
if !creoHwnd
return
; 1. 获取鼠标屏幕物理坐标
VarSetCapacity(pt, 8, 0)
DllCall("GetCursorPos", "Ptr", &pt)
physX := NumGet(pt, 0, "Int")
physY := NumGet(pt, 4, "Int")
; 2. 根据 Creo 窗口 DPI 转为逻辑屏幕坐标
hdc := DllCall("GetDC", "Ptr", creoHwnd)
dpi := DllCall("GetDeviceCaps", "Ptr", hdc, "Int", 88)
DllCall("ReleaseDC", "Ptr", creoHwnd, "Ptr", hdc)
sysDPI := 96
if (dpi != 0 and dpi != sysDPI) {
mouseX := Round(physX * sysDPI / dpi)
mouseY := Round(physY * sysDPI / dpi)
} else {
mouseX := physX
mouseY := physY
}
; 3. 构造 lParam(高16位Y,低16位X)
lParam := (mouseY << 16) | (mouseX & 0xFFFF)
; 4. 滚轮增量(120 = 一格)
delta := (A_ThisHotkey = "WheelUp") ? 120 : -120
; 5. 向 Creo 主窗口发送 WM_MOUSEWHEEL 消息
PostMessage, 0x020A, % (delta << 16), % lParam, , ahk_id %creoHwnd%
return
#If
MouseIsOverCreoMainWindow(proc) {
MouseGetPos, , , hWin
WinGet, pName, ProcessName, ahk_id %hWin%
return (pName = proc)
}
五、使用步骤
六、常见问题与排查

七、可选:开机自启
八、总结
通过 AutoHotkey 脚本直接向 Creo 主窗口发送携带正确屏幕坐标的 WM_MOUSEWHEEL 消息,彻底解决了 Windows“非活动窗口滚动”功能与 Creo 模型区缩放之间的兼容性冲突,实现了两者完美共存。整个过程避免了安装额外驱动,绿色、高效、开源。
用deepseek琢磨出来的
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删