MsgBox和底层的MessageBox都没有指定弹出位置的功能。但是windows提供了一种窗口钩子:WH_CBT,能够在窗口创建,销毁,移动,最大化,最小化等活动之前让我们修改某些属性,从而实现阻止弹窗,阻止移动,修改窗口位置等功能。
MsgBox本质上也是一个窗口,我们只要在它创建之前修改它的初始x轴和y轴就可以实现自定义弹出位置的功能。
#Requires AutoHotkey v2.0.0 64-bit
MsgBoxAt(x, y, text?, title?, options?) {
if hHook := DllCall("SetWindowsHookExW", "int", 5, "ptr", cb := CallbackCreate(CBTProc), "ptr", 0, "uint", DllCall("GetCurrentThreadId", "uint"), "ptr") {
res := MsgBox(text ?? unset, title ?? unset, options ?? unset)
if hHook
DllCall("UnhookWindowsHookEx", "ptr", hHook)
}
CallbackFree(cb)
return res ?? ""
CBTProc(nCode, wParam, lParam) {
if nCode == 3 && WinGetClass(wParam) == "#32770" {
DllCall("UnhookWindowsHookEx", "ptr", hHook)
hHook := 0
pCreateStruct := NumGet(lParam, "ptr")
NumPut("int", x, pCreateStruct, 44)
NumPut("int", y, pCreateStruct, 40)
}
return DllCall("CallNextHookEx", "ptr", 0, "int", nCode, "ptr", wParam, "ptr", lParam)
}
}
使用也很简单:
MsgBoxAt(300, 300, "Content", "Title", "YesNo")
可以,非常好用!